2009-04-21 22 views
17

Quiero dibujar algunos datos en una textura: muchos elementos en una fila. No están creados en orden, y todos pueden ser de diferentes tamaños (piense en un montón de memoria). Cada elemento de datos es un pequeño rectángulo y quiero poder distinguirlos, por lo que me gustaría que cada uno de ellos tenga un color único.Generar colores únicos

Ahora podría usar rand() para generar valores RGB y espero que sean todos diferentes, pero sospecho que no obtendré una buena distribución en el espacio RGB. ¿Hay una mejor manera que esto? P.ej. ¿Cuál es una buena forma de pedalear a través de diferentes colores antes de que (casi) se repitan?

Los colores no tienen que coincidir con ningún dato de los elementos. Solo quiero poder ver muchos valores y ver que son diferentes, ya que son adyacentes.

Podría resolver algo, pero creo que esta es una pregunta interesante. :)

+0

¡eso es cierto! esta es una pregunta muy interesante :-) – dfa

+0

Ver http://stackoverflow.com/questions/470690/how-to-automatically-generate-n-distinct-colors/4382138#4382138 –

Respuesta

13

El uso del modelo de color RGB no es una buena forma de obtener una buena combinación de colores. Es mejor usar otro modelo de color para generar su color y luego convertirlo de ese modelo de color a RGB.

En su lugar, le sugiero el modelo de color HSV or HSL, en particular, quiere variar el Hue.

Si desea valores diferentes de color X, ellos varían de 0 a 360 con un tamaño de paso de 360 ​​dividido por X.

+1

0, 360 (mismos colores), 180 , 300, 390, 102, 162, 213, 258, 298 (básicamente 300 de nuevo), 334, 367, (básicamente 360 ​​una tercera vez). – Tatarize

2

¿Cuál es su espacio muestral ... cuántos elementos estamos hablando.

Se puede construir una matriz de RGB Triples de

for(int r = 0; r < 255; r = r+16) 
    for(int g = 0; g < 255; g = g+16) 
     for(int b = 0; b < 255; b = b+16) 
      // take r, g, b and add it to a list 

A continuación, asignar al azar a su lista y iterar a través de él. que le daría 16^3 (4096) colores diferentes antes de un color repetido.

+0

Eso es idéntico a rand (0,16) << 20 | rand (0,16) << 12 | rand (0,16) << 4. Es un color aleatorio entre # 000 y #FFF en color de 12 bits, buscando las repeticiones. Sus # 0A0 y # 090, por ejemplo, especialmente con las distinciones de color con verdes, se verán muy idénticos. – Tatarize

4

En general, RGB no es un gran espacio de color para hacer este tipo de cosas, ya que es perceptualmente no lineal, para empezar. Esto significa que las distancias iguales movidas entre los trillizos RGB no se ven igualmente diferentes a nuestros ojos.

Probablemente trabajaría en el espacio L*c*h* (see also), o espacio HSL, y solo generaría un espaciado uniforme en el tono. Estos espacios han sido diseñados para ser aproximadamente perceptualmente lineales.

+2

Incluso en HSL el espaciado regular de 'hue' es [no perceptualmente lineal] (http://phrogz.net/tmp/colordifferences). – Phrogz

+1

HSL es una conversión matemática directa de RGB independientemente del tono particular. Los espacios no están diseñados para ser lineales. LCH es una modificación de LAB que en realidad requiere un estiramiento basado en tonalidad para ajustarse mejor al ojo humano. – Tatarize

0

Esto es muy similar al problema de cuatro colores en relación con los mapas para colorear, esto podría dar algunas soluciones interesantes para usted:

Four colour theorem

+2

Realmente no es tan similar al problema de 4 colores. Nick está usando tantos colores como necesites, mientras que los problemas de coloración intentan minimizar cuántos necesitas ... – simon

+0

En realidad no tiene nada que ver con el problema de 4 colores, en el que solo se necesitan 4 colores y solo se usan como "etiquetas". Aquí le preocupan las cualidades ópticas (uniformidad) de los colores seleccionados. – Hejazzman

+1

No estoy de acuerdo, creo que hay un mérito en el problema de 4 colores aquí. El problema es distinguir elementos dispuestos en un plano 2D mediante el uso del color. El problema de 4 colores demuestra que * puedes * resolver el problema utilizando solo 4 colores contrastantes. –

2

Google "Delta E CIE 2000"; la fórmula de diferencia de color es útil para determinar la distancia aparente (visual) entre 2 colores. (En un monitor, hay una fórmula diferente para los pigmentos). Opera en colores en el espacio de laboratorio (apoyos para simon), pero aplica un cálculo de diferencia perceptual.

Hemos encontrado que un número de alrededor de 1,5 era suficiente para asegurar visualmente distintas colores (es decir, se puede decir la diferencia si están cerca uno del otro), pero si quieres identificables colores (se puede encontrar en cualquier color una leyenda) necesitarás aumentar eso.

En cuanto a la creación de un conjunto de colores ...Probablemente comenzaría en algún rincón del espacio del laboratorio y caminaría alrededor de él usando un tamaño de paso que ofrezca diferencias visuales suficientemente grandes (nota: no es lineal, por lo que el tamaño del paso probablemente tendrá que ser adaptativo) y luego aleatorice la lista.

0

Si sólo necesita un conjunto de colores perceptualmente distintas (y no un algoritmo para generar ellos) he creado una herramienta gratuita en mi sitio web que hace precisamente eso:
http://phrogz.net/css/distinct-colors.html

en lugar de usar incluso espacio en el espacio RGB o HSV (que no están uniformemente distribuidos con respecto a la percepción humana) la herramienta le permite generar una cuadrícula de valores en el espacio HSV y luego utiliza el estándar CMC(I:c) para distancia de color para arrojar colores perceptualmente demasiado cercanos el uno al otro. (El control deslizante 'umbral' en la segunda pestaña le permite controlar qué tan visualmente distintos deben ser los colores, mostrándole los resultados en tiempo real.)

Al final, puede ordenar su lista de colores generados por diversos criterios, y luego "barajee" de manera uniforme esa lista para que tenga garantizados valores visualmente distintos adyacentes entre sí en la lista. (Recomiendo un valor de 'Intercalado' de aproximadamente 5.)

Al escribir estas líneas la herramienta funciona bien con Chrome, Safari y (a través de una cuña) Firefox; IE9 no es compatible con los controles deslizantes de entrada de rango HTML5, que la interfaz de usuario usa ampliamente para la exploración interactiva.

Cuestiones relacionadas