2009-07-22 19 views
24

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).Algoritmo para generar colores únicos

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

Respuesta

6

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

Si desea generar colores en lugar de utilizar una lista, un truco para hacer que tengan un aspecto consistente y decente es generarlos utilizando HSB. Predefina un brillo y saturación, luego base el valor de tono fuera de alguna función de la ID (esto puede ser una variedad de cosas dependiendo de cuántos identificadores planee tener, pero multiplicando la ID por cierta cantidad (y modding cuando exceda) 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 batida juntos 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; 
     } 
    } 
} 
+0

Véase mi respuesta para una forma de evitar la predicción de la EXPECTED_MAX y aún así obtener una distribución uniforme. –

16

puede multiplicar la Identificación por el golden ratio (phi) para obtener un número 0 < n = < 1. Todos los números que generan tenderá a ser distribuido uniformemente

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

Luego, se trata de convertir ese número a un color, p.

hue = floor(n * 256) 
+7

http://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/ –

10

Los diseñadores gráficos saben que si una gran cantidad de colores van a ser utilizados cerca uno del otro en una pantalla de información, los colores deben ser relativamente cerca uno del otro en el espacio de color. Pequeños cambios en la saturación o el tono suelen ser mejores que los saltos grandes – cuando se trata de muchos colores, el ojo humano en realidad lo encuentra más fácil para asimilar información cuando las distancias de color no son muy grandes.

Además, no olvide que algunos de sus usuarios serán daltónicos. Como hay tantas variedades de daltonismo, es difícil saber qué combinaciones evitar. ¿Tal vez alguien más puede responder a esta pregunta?

10

He escrito un artículo sobre este mismo tema:

How to Generate Random Colors Programmatically

Básicamente se puede utilizar el espacio de color HSV, establezca una saturación y valor fijo, y modificar la tonalidad. Cuando conozca la cantidad de colores que necesita, simplemente divida el rango Hue [0,1[ con esto. Si no conoce la cantidad de colores requeridos, aún puede usar la proporción áurea para seleccionar colores de este espacio.

+2

Implementé su algoritmo usando JavaScript: http://jsfiddle.net/hCtc3/2/ –

+1

@philmccull lo modifiqué para generar 30 colores únicos y visualmente diferentes cambiando solo el tono. http://jsfiddle.net/hCtc3/42 – Berty

+1

Buena técnica. – Timmmm

16

He comprobado todas las formas de hacerlo, resolviendo más de unas pocas maneras. 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 30 colores con buena distinción sin importar lo que haga. Considera el daltonismo y las líneas de confusión, y realmente estás creando 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.

max difference color palette

#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 
Cuestiones relacionadas