2010-02-18 21 views
19

Me gustaría tener una enumeración de colores basada en los colores del arco iris (rojo ... amarillo ... verde ... azul ...).¿Cómo obtengo un degradado de color del arco iris en C#?

que ver básicamente dos maneras de hacerlo:

  1. Crear una tabla de consulta que contiene algunos colores de referencia importantes e interpolar entre estos. No me gusta esta idea en absoluto.

  2. Aplica algunas matemáticas más o menos elaboradas. Probablemente menos, pero no veo muy bien cómo funciona. ¿Algunas ideas?

(Ah, y si bien he hecho un poco de investigación SO, no encontré buenos resultados. Si esta pregunta ya fue publicada, por favor, me acaba de apuntar a la ubicación y voy a borrar esto.)

Edit: Prefiero tener esto independientemente de la tecnología utilizada para mostrar el degradado. Por ejemplo, algo como GetRainbowColor (float f) con f que van desde 0 (rojo) a 1 (violeta) funcionaría muy bien.

+1

WPF? WinForms? ASP.NET? La respuesta puede cambiar dependiendo de la tecnología. –

Respuesta

30

Esto es más fácil de lo que piensas.

Primero necesita una función de conversión de hsv o hsl a rgb. Here is C# code to do that conversion.

Luego simplemente itere sobre todos los valores posibles del tono h mientras mantiene constante el saturation sy la luminosidad l.

Si usted quiere el 100 colores del arco iris espaciados por igual:

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

También puede crear fácilmente su función deseada GetRainbowColor esta manera mediante la adición de todos estos colores a un List<ColorRGB> y devolver el color indexado apropiado.

+5

Consulte también http://en.wikipedia.org/wiki/HLS_color_space, hay una sección sobre cómo convertir HSL a/desde RGB – DNNX

0

de inicio aquí: http://www.midnightkite.com/color.html

Usted puede interpretar esto: http://www.physics.sfasu.edu/astro/color/spectra.html es FORTRAN, pero es bastante obvio lo que hace.

Además, se puede leer más en profundidad aquí: http://en.wikipedia.org/wiki/CIE_1931_color_space

Aquí hay una versión en Python: http://www.johnny-lin.com/py_code/wavelen2rgb.py

Por cierto, el primer Google golpe para C# es la siguiente: http://miguelmoreno.net/sandbox/wavelengthtoRGB/default.aspx

1

En WinForms (o cualquier cosa usando GDI +) podrías usar System.Drawing.Drawing2D.LinearGradientBrush para hacer la interpolación por ti.

WPF System.Windows.Media.GradientBrush podría funcionar también. Es abstracto, así que podrías terminar con LinearGradientBrush de WPF. Está en un espacio de nombre diferente que el otro.

EDITAR: dado que la pregunta fue editada para indicar que desea ser independiente de la tecnología, no creo que se aplique esta respuesta. Voy a dejarlo aquí por ahora en caso de que alguien esté buscando Gradientes en C#, pero si alguien lo considera objetable, eliminaré la respuesta.

Hice una comprobación rápida para ver si al menos podía obtener algunas de las funciones de una manera más independiente (como obtener una matriz de puntos o algo así). No parece ser el caso.

6

me gusta usar esto:

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

Aquí hay uno que me gusta usar (la salida es un color HTML RGB):

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/ Permite más o menos lo que estás buscando para, también se puede instalar como un paquete NuGet. No es exactamente un degradado de arco iris. Pero puede escribir gradientes a la consola, también esto confunde el IDE entre el

Colorful.Console 

y

System.Console 

Así que asegúrese de definir la consola derecha.

Cuestiones relacionadas