2009-07-22 17 views
24

Sto cercando un algoritmo che generi una serie di colori in modo che i colori siano distribuiti il ​​più ampiamente possibile (quindi non saranno facilmente confusi).Algoritmo per la generazione di colori univoci

Ho una serie di oggetti con ID che contano da 1. Mi piacerebbe rappresentare ognuno di questi con un colore diverso, esteticamente gradevole, che non si confonda facilmente con i suoi vicini. I colori non dovrebbero essere necessariamente casuali. Mi piacerebbe ottenere lo stesso colore ogni volta che inserisco lo stesso ID.

risposta

6

Il numero di elementi possibili ha un limite inferiore ragionevole? Una soluzione semplice e veloce consiste nel memorizzare una serie di valori di colore usando l'ID dell'articolo. Ciò presuppone che tu abbia una quantità relativamente bassa di colori, e sei certo che non andrai oltre un certo numero di articoli, comunque.

Se si desidera generare colori anziché utilizzare un elenco, un trucco per far sì che abbiano un aspetto coerente e dignitoso è di generarli utilizzando HSB. Pre-definire una luminosità e una saturazione, quindi basare il valore della tonalità su alcune funzioni dell'ID (può essere una varietà di cose a seconda del numero di ID che si prevede di avere, ma moltiplicando l'ID di una certa quantità (e modificando quando supera 255!) È un buon approccio approssimativo: con questo approccio i colori saranno tutti "allineati" in termini di saturazione e luminosità ma ognuno avrà un colore distinto

Sono un po 'annoiato al lavoro, quindi montata insieme una soluzione veloce:.

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

Vedere la mia risposta di un modo per evitare di predire l'EXPECTED_MAX e ancora ottenere una distribuzione uniforme. –

16

È possibile moltiplicare l'id dalla golden ratio (phi) per ottenere un numero 0 < = n < 1. Tutti i numeri che generano tenderà ad essere distribuito in modo uniforme

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

Quindi si tratta di convertire quel numero in un colore, ad es.

hue = floor(n * 256) 
+7

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

10

Graphic designer sanno che se un sacco di colori stanno per essere utilizzati vicino a vicenda in una visualizzazione delle informazioni, i colori dovrebbero essere relativamente vicini l'uno all'altro nello spazio di colore. Piccole variazioni di saturazione o tinta sono in genere migliori dei grandi salti – quando sono coinvolti molti colori, l'occhio umano lo trova in realtà più semplice per assimilare le informazioni quando le distanze dei colori non sono molto grandi.

Inoltre, non dimenticare che alcuni dei tuoi utenti saranno daltonici. Poiché ci sono così tante varietà di daltonismo, è difficile sapere quali combinazioni evitare. Forse qualcun altro può rispondere a questa domanda?

10

Ho scritto un articolo su questo stesso argomento:

How to Generate Random Colors Programmatically

Fondamentalmente si può usare lo spazio colore HSV, impostare una saturazione fissa e valore, e modificare la tonalità. Quando si conosce il numero di colori necessari, basta dividere l'intervallo di tonalità [0,1[ con questo. Se non conosci il numero di colori richiesti, puoi comunque utilizzare la sezione aurea per selezionare i colori da questo spazio.

+2

Ho implementato il tuo algoritmo utilizzando JavaScript: http://jsfiddle.net/hCtc3/2/ –

+1

@philmccull l'ho modificato per generare solo 30 colori unici e visivamente diversi cambiando solo la tonalità. http://jsfiddle.net/hCtc3/42 – Berty

+1

Bella tecnica. – Timmmm

16

Ho controllato tutti i modi per farlo, risolvendo più di alcuni modi. E infine la forza bruta con CIEde2000 e in realtà, la tua migliore scommessa è solo una lista statica. Non puoi ottenere più di circa 30 colori con una buona distinzione, qualunque cosa tu faccia. Fattore di cecità ai colori e le linee di confusione, e stai davvero facendo qualcosa che è un ostacolo.Utilizzare una tabella di ricerca e modificare i punti di dati con alcune altre caratteristiche oltre al solo colore.

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 
Problemi correlati