algorithm colors language-agnostic

algorithm - Algoritmo para generar colores únicos



colors language-agnostic (5)

Estoy buscando un algoritmo que genere una serie de colores para que los colores se distribuyan lo más ampliamente posible (para que no se mezclen fácilmente).

Tengo una serie de objetos que tienen identificaciones que cuentan desde 1. Me gustaría representar cada uno de ellos con un color diferente, estéticamente agradable, que no se confundirá fácilmente con sus vecinos. Sin embargo, los colores no deben ser necesariamente aleatorios. Me gustaría obtener el mismo color cada vez que ingrese la misma ID.


¿El número de elementos posibles tiene un límite bajo razonable? Una solución rápida y fácil es simplemente almacenar una serie de valores de color utilizando el ID del artículo. Eso supone que tiene una cantidad de colores relativamente baja y que, sin embargo, está seguro de que no superará cierto número de elementos.

Si desea generar colores en lugar de usar una lista, un truco para hacer que tengan un aspecto coherente y decente es generarlos utilizando HSB. Predefinir un brillo y una saturación, luego basar el valor de tono en alguna función de la ID (esto puede ser una variedad de cosas dependiendo de la cantidad de ID que planea tener, pero multiplicando la ID por cierta cantidad (y modding cuando excede) 255!) Es un buen enfoque aproximado. Con este enfoque, todos los colores se "alinearán" en términos de saturación y brillo, pero cada uno tendrá un color distinto.

Estoy un poco aburrido en el trabajo, así que reuní una solución rápida:

class HsbColor { public int Hue { get; set; } public int Saturation { get; set; } public int Brightness { get; set; } public Color ToRGB { // left as exercise to the reader... } } public class Item { public int Id { get; set; } private static const byte EXPECTED_MAX = 15; private static int HUE_FACTOR = 255 / EXPECTED_MAX; public HsbColor Color { get { var color = new HsbColor() { Saturation = 175, Brightness = 175 }; color.Hue = (Id * HUE_FACTOR) % 255; return color; } } }


He comprobado todas las formas de hacerlo, resolviendo más que algunas formas. Y finalmente, la fuerza bruta con CIEde2000 y, en realidad, su mejor apuesta es solo una lista estática. No puede obtener más de unos 30 colores con buena distinción, sin importar lo que haga. Factor en la ceguera al color y las líneas de confusión, y realmente estás haciendo algo que es un obstáculo. Use una tabla de búsqueda y modifique los puntos de datos con algunas otras características además del color.

#000000 #00FF00 #0000FF #FF0000 #01FFFE #FFA6FE #FFDB66 #006401 #010067 #95003A #007DB5 #FF00F6 #FFEEE8 #774D00 #90FB92 #0076FF #D5FF00 #FF937E #6A826C #FF029D #FE8900 #7A4782 #7E2DD2 #85A900 #FF0056 #A42400 #00AE7E #683D3B #BDC6FF #263400 #BDD393 #00B917 #9E008E #001544 #C28C9F #FF74A3 #01D0FF #004754 #E56FFE #788231 #0E4CA1 #91D0CB #BE9970 #968AE8 #BB8800 #43002C #DEFF74 #00FFC6 #FFE502 #620E00 #008F9C #98FF52 #7544B1 #B500FF #00FF78 #FF6E41 #005F39 #6B6882 #5FAD4E #A75740 #A5FFD2 #FFB167 #009BFF #E85EBE


He escrito un artículo sobre este mismo tema:

martin.ankerl.com/2009/12/09/…

Básicamente, puede utilizar el espacio de color HSV, establecer una Saturación y un Valor fijos, y modificar el Matiz. Cuando sepa la cantidad de colores que necesita, simplemente divida el rango de Tono [0,1[ por esto]. Si no conoce el número de colores requeridos, aún puede usar la proporción de oro para seleccionar colores de este espacio.


Los diseñadores gráficos saben que si se van a usar muchos colores cerca uno del otro en una pantalla de información, los colores deben estar relativamente cerca uno del otro en el espacio de color. Los pequeños cambios en la saturación o el matiz son generalmente mejores que los saltos grandes: cuando hay muchos colores involucrados, al ojo humano realmente le resulta más fácil asimilar la información cuando las distancias de color no son muy grandes.

Además, no olvide que algunos de sus usuarios serán daltónicos. Dado que hay tantas variedades de ceguera al color, es difícil saber qué combinaciones evitar. Tal vez alguien más puede abordar esta pregunta?


Puede multiplicar la identificación por la proporción de oro (phi) para obtener un número 0 <= n <1. Todos los números que genere tenderán a distribuirse de manera uniforme.

PHI = (1 + sqrt(5))/2 n = id * PHI - floor(id * PHI)

Entonces es cuestión de convertir ese número a un color, por ejemplo,

hue = floor(n * 256)