2010-02-18 8 views
19

J'aimerais avoir une énumération des couleurs basées sur les couleurs de l'arc-en-ciel (rouge ... jaune ... vert ... bleu ...).Comment puis-je obtenir un dégradé de couleurs arc-en-ciel en C#?

Je vois essentiellement deux façons de le faire:

  1. création d'une table de recherche contenant des couleurs de référence importantes et interpoler entre ceux-ci. Je n'aime pas du tout cette idée.

  2. Appliquez des mathématiques plus ou moins sophistiquées. Probablement moins, mais je ne vois pas très bien comment cela fonctionne. Des idées?

(Oh, et pendant que je faisais des recherches, je trouve pas de bons résultats. Si cette question était déjà affichée, s'il vous plaît me pointer juste à l'endroit et je vais supprimer cela.)

Editer: Je préférerais avoir ceci indépendant de la technologie utilisée pour afficher le gradient. Par exemple, quelque chose comme GetRainbowColor (float f) avec f allant de 0 (rouge) à 1 (violet) fonctionnerait bien.

+1

WPF? WinForms? ASP.NET? La réponse pourrait changer en fonction de la technologie. –

Répondre

30

C'est plus facile que vous ne le pensez.

D'abord vous avez besoin d'une fonction de conversion hsv ou hsl to rgb. Here is C# code to do that conversion.

Ensuite, il vous suffit de parcourir toutes les valeurs possibles de la teinte h tout en gardant les saturation s et la luminosité l constante.

Si vous voulez 100 couleurs de l'arc en ciel espacées également:

for(double i = 0; i < 1; i+=0.01) 
{ 
    ColorRGB c = HSL2RGB(i, 0.5, 0.5); 
    //do something with the color 
} 

Vous pouvez aussi créer facilement la fonction souhaitée GetRainbowColor cette façon en ajoutant toutes ces couleurs à un List<ColorRGB> et en retournant la couleur indexée appropriée.

+5

Voir aussi http://en.wikipedia.org/wiki/HLS_color_space, il y a une section sur la conversion de HSL vers/depuis RGB – DNNX

0

Commencez ici: http://www.midnightkite.com/color.html

Vous pouvez interpréter ceci: http://www.physics.sfasu.edu/astro/color/spectra.html il est FORTRAN, mais il est assez évident ce qu'il fait.

En outre, vous pouvez en savoir plus en profondeur ici: http://en.wikipedia.org/wiki/CIE_1931_color_space

Voici une version en Python: http://www.johnny-lin.com/py_code/wavelen2rgb.py

BTW, le premier Google succès pour C# est la suivante: http://miguelmoreno.net/sandbox/wavelengthtoRGB/default.aspx

1

En WinForms (ou n'importe quoi utilisant GDI +) vous pouvez utiliser System.Drawing.Drawing2D.LinearGradientBrush pour faire l'interpolation pour vous.

Le fichier System.Windows.Media.GradientBrush de WPF peut également fonctionner. C'est abstrait, donc vous pourriez finir avec LinearGradientBrush de WPF. C'est dans un espace de noms différent de l'autre.

EDIT: comme la question a été modifiée pour indiquer que vous voulez être indépendant de la technologie, je ne pense pas que cette réponse s'applique. Je vais le laisser ici pour le moment au cas où quelqu'un chercherait Gradients in C#, mais si quelqu'un trouve cela répréhensible, je supprimerai la réponse.

J'ai fait une vérification rapide pour voir si vous pouviez au moins obtenir certaines des fonctionnalités d'une manière plus indépendante (comme obtenir un tableau de Point ou quelque chose). Cela ne semble pas être le cas.

6

J'aime utiliser ceci:

public static Color Rainbow(float progress) 
{ 
    float div = (Math.Abs(progress % 1) * 6); 
    int ascending = (int) ((div % 1) * 255); 
    int descending = 255 - ascending; 

    switch ((int) div) 
    { 
     case 0: 
      return Color.FromArgb(255, 255, ascending, 0); 
     case 1: 
      return Color.FromArgb(255, descending, 255, 0); 
     case 2: 
      return Color.FromArgb(255, 0, 255, ascending); 
     case 3: 
      return Color.FromArgb(255, 0, descending, 255); 
     case 4: 
      return Color.FromArgb(255, ascending, 0, 255); 
     default: // case 5: 
      return Color.FromArgb(255, 255, 0, descending); 
    } 
} 
1

est ici que j'aime utiliser (la sortie est une couleur RVB HTML):

public static String Rainbow(Int32 numOfSteps, Int32 step) 
     { 
      var r = 0.0; 
      var g = 0.0; 
      var b = 0.0; 
      var h = (Double)step/numOfSteps; 
      var i = (Int32)(h * 6); 
      var f = h * 6.0 - i; 
      var q = 1 - f; 

      switch (i % 6) 
      { 
       case 0: 
        r = 1; 
        g = f; 
        b = 0; 
        break; 
       case 1: 
        r = q; 
        g = 1; 
        b = 0; 
        break; 
       case 2: 
        r = 0; 
        g = 1; 
        b = f; 
        break; 
       case 3: 
        r = 0; 
        g = q; 
        b = 1; 
        break; 
       case 4: 
        r = f; 
        g = 0; 
        b = 1; 
        break; 
       case 5: 
        r = 1; 
        g = 0; 
        b = q; 
        break; 
      } 
      return "#" + ((Int32)(r * 255)).ToString("X2") + ((Int32)(g * 255)).ToString("X2") + ((Int32)(b * 255)).ToString("X2"); 
     } 
0

http://colorfulconsole.com/ Permet à peu près ce que vous cherchez pour, peut également être installé en tant que paquet NuGet. Ce n'est pas exactement un dégradé arc-en-ciel. Mais il peut écrire des gradients à la console, aussi cette embrouille l'IDE entre le

Colorful.Console 

et

System.Console 

alors assurez-vous de définir le droit de la console.

Questions connexes