2009-10-07 6 views

Répondre

9

Vous pouvez utiliser la couleur HSB (Teinte, Saturation, Luminosité) au lieu de la couleur RVB. .Net peut convertir automatiquement les couleurs RVB en HSB (avec les méthodes Color.GetHue, .GetSaturation et .GetBrightness) mais ne va pas dans l'autre sens. Voici un exemple de code qui gère la conversion de couleurs HSB RGB:

http://splinter.com.au/blog/?p=29

(cet exemple de code utilise « V » au lieu de « B », probablement pour la « valeur » au lieu de « brillance »). L'avantage de l'utilisation de la couleur HSB est que le paramètre Teinte est compris entre 0 et 360, et peut être interprété comme une position sur la roue chromatique, de sorte que les valeurs passent bien de 360 ​​à 0. Pour vos besoins, vous pourriez créez des couleurs en définissant les valeurs de saturation et de luminosité sur 1.0 (leurs maximums), puis en variant la valeur de teinte pour créer les différentes couleurs du spectre.

En ce qui concerne votre question (et d'élaborer sur Rubens réponse), vous pouvez créer une couleur de toute valeur int32 comme ceci:

int i = 4837429; 
Color color = Color.FromArgb(i); 

Toutefois, cela ne réalisera pas le wrap-around effet de couleur que vous décrivez dans votre question, et en fait une grande partie de la variation de vos valeurs int32 (en supposant que vous allez de la MinValue à la MaxValue) va s'appliquer à la couche alpha, ou l'opacité, qui ne ressemble pas à ce que vous vouloir.

Mise à jour: voici quelque chose qui devrait faire ce que vous avez besoin:

private const double ONE_SIXTH = 
    0.16666666666666666666666666666667; 
private const double ONE_THIRD = 
    0.33333333333333333333333333333333; 
private const double TWO_THIRDS = 
    0.66666666666666666666666666666667; 
private const double FIVE_SIXTHS = 
    0.83333333333333333333333333333333; 
public Color WheelColor(double d) 
{ 
    if ((d < 0.0) || (d > 1.0)) 
    { 
     throw new ArgumentOutOfRangeException("d", 
      d, "d must be between 0.0 and 1.0, inclusive"); 
    } 
    double R = 1; 
    double G = 1; 
    double B = 1; 
    if (d < ONE_SIXTH) 
    { 
     G = d/ONE_SIXTH; 
     B = 0; 
    } 
    else if (d < ONE_THIRD) 
    { 
     R = 1 - ((d - ONE_SIXTH)/ONE_SIXTH); 
     B = 0; 
    } 
    else if (d < 0.5) 
    { 
     R = 0; 
     B = (d - ONE_THIRD)/ONE_SIXTH; 
    } 
    else if (d < TWO_THIRDS) 
    { 
     R = 0; 
     G = 1 - ((d - 0.5)/ONE_SIXTH); 
    } 
    else if (d < FIVE_SIXTHS) 
    { 
     R = (d - TWO_THIRDS)/ONE_SIXTH; 
     G = 0; 
    } 
    else 
    { 
     B = 1 - ((d - FIVE_SIXTHS)/ONE_SIXTH); 
     G = 0; 
    } 
    return Color.FromArgb((int)(R * 255), 
     (int)(G * 255), (int)(B * 255)); 
} 

Le paramètre d dans WheelColor est censé aller de 0,0 à 1,0, et le cycle de volonté à travers la roue de couleur (en quelque sorte), commençant au rouge quand d = 0.0 et revenant au rouge quand d = 1.0.

+0

+1: ty pour votre réponse complète! –

+0

Aïe, ça sonne dur ... je vois si je peux monter un sous-programme qui convertira mon entier en un nombre utilisable. – Cyclone

+0

Impossible de le faire>.> – Cyclone

Questions connexes