2009-04-21 27 views
17

Voglio disegnare alcuni dati in una trama: molti elementi in una riga. Non sono creati in ordine e possono essere tutti di dimensioni diverse (si pensi ad un heap di memoria). Ogni elemento di dati è un piccolo rettangolo e voglio essere in grado di distinguerli a parte, quindi vorrei che ognuno di essi avesse un colore unico.Genera colori univoci

Ora potrei semplicemente usare rand() per generare valori RGB e sperare che siano tutti diversi, ma sospetto che non otterrò una buona distribuzione nello spazio RGB. C'è un modo migliore di questo? Per esempio. qual è un buon modo di pedalare attraverso diversi colori prima che si ripetano (quasi)?

I colori non devono corrispondere con alcun dato negli articoli. Voglio solo essere in grado di osservare molti valori e vedere che sono diversi, in quanto sono adiacenti.

Potrei immaginare qualcosa ma penso che questa sia una domanda interessante. :)

+0

questo è vero! questa è una domanda molto interessante :-) – dfa

+0

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

risposta

13

L'utilizzo del modello di colore RGB non è un buon modo per ottenere un buon mix di colori. È meglio utilizzare un altro modello di colori per generare il proprio colore e quindi convertire da quel modello di colore in RGB.

Vi suggerisco invece il modello di colore HSV or HSL, in particolare si desidera variare lo Hue.

Se volete valori di colore diverso X, li variano da 0 a 360, con un passo di 360 diviso per X.

+1

0, 360 (stessi colori), 180 , 300, 390, 102, 162, 213, 258, 298 (in pratica ancora 300 di nuovo), 334, 367, (in pratica 360 una terza volta). – Tatarize

2

Che cosa è il vostro spazio campione ... quanti oggetti stiamo parlando.

Si potrebbe costruire una serie di triple di RGB

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 

Poi randomizzare vostra lista e scorrere attraverso di essa. che ti darà 16^3 (4096) colori diversi prima di un colore ripetuto.

+0

È identico a rand (0,16) << 20 | rand (0,16) << 12 | rand (0,16) << 4. È un colore casuale compreso tra # 000 e #FFF a colori a 12 bit, che controlla le ripetizioni. I tuoi # 0A0 e # 090 ad esempio, in particolare con le distinzioni di colore con i verdi, sembreranno piuttosto identici. – Tatarize

4

In generale, RGB non è un grande spazio cromatico per fare questo tipo di cose perché è percettivamente non lineare, per i principianti. Ciò significa che le distanze uguali spostate tra le terzine RGB non sembrano ugualmente diverse ai nostri occhi.

probabilmente sarei lavoro nel L*c*h* spazio (see also) spazio, o HSL spazio, e solo creare una spaziatura uniforme tonalità. Questi spazi sono stati progettati per essere approssimativamente percettivamente lineari.

+2

Anche in HSL la spaziatura regolare di 'hue' è [non percettivamente lineare] (http://phrogz.net/tmp/colordifferences). – Phrogz

+1

HSL è una conversione matematica diretta da RGB indipendentemente dalla tonalità specifica. Gli spazi non sono progettati per essere lineari. LCH è una modifica di LAB che in realtà richiede uno streaching basato su tonalità per adattarsi meglio all'occhio umano. – Tatarize

0

Questo è molto simile al problema dei quattro colori relative alle mappe colorare, questo potrebbe produrre alcune soluzioni interessanti per voi:

Four colour theorem

+2

In realtà non è affatto simile al problema dei 4 colori. Nick usa tutti i colori necessari, mentre i problemi di colorazione stanno cercando di minimizzare quanti ne hai bisogno .... – simon

+0

In realtà non ha nulla a che fare con il problema dei 4 colori, in cui sono necessari solo 4 colori e sono usati solo come "tag". Qui si occupa delle qualità ottiche (uniformità) dei colori selezionati. – Hejazzman

+1

Non sono d'accordo, penso che ci sia merito nel problema dei 4 colori qui. Il problema è distinguere gli articoli disposti in un piano 2D attraverso l'uso del colore. Il problema dei 4 colori dimostra che * puoi * risolvere il problema usando solo 4 colori contrastanti. –

2

Google "Delta E cie 2000"; la formula della differenza cromatica è utile per determinare la distanza apparente (visiva) tra 2 colori. (Su un monitor, c'è una formula diversa per i pigmenti.) Funziona sui colori nello spazio Lab (oggetti di scena in simon), ma applica un calcolo percettivo della differenza.

Abbiamo scoperto che un certo numero di circa 1,5 è stato sufficiente a garantire visivamente colori distinti (per esempio, si può dire la differenza se sono vicino l'un l'altro), ma se si vuole identificabili colori (è possibile trovare qualsiasi colore una leggenda) dovrai affrontarlo.

Come creare un set di colori ...Probabilmente comincerei da un angolo dello spazio Lab e lo girerei usando una dimensione di passo che dia grandi differenze visive (nota: non è lineare, quindi la dimensione del passo dovrà probabilmente essere adattiva) e quindi randomizzare l'elenco.

0

Se avete solo bisogno di un insieme di colori percettivamente-distinti (e non un algoritmo per generare loro) ho creato uno strumento gratuito sul mio sito che fa proprio questo:
http://phrogz.net/css/distinct-colors.html

Invece di limitarsi a utilizzare anche spaziando nello spazio RGB o HSV (che non sono distribuiti uniformemente rispetto alla percezione umana) lo strumento consente di generare una griglia di valori nello spazio HSV e quindi utilizza lo standard CMC(I:c) per la distanza di colore per eliminare colori che sono percettivamente troppo vicini a vicenda. (Il cursore "soglia" nella seconda scheda consente di controllare quanto visivamente distinti devono essere i colori, mostrandoli in tempo reale.)

Alla fine, è possibile ordinare l'elenco dei colori generati in base a vari criteri, e quindi "mischia" uniformemente quell'elenco in modo tale da garantire che i valori visivamente distinti siano l'uno accanto all'altro nella lista. (Raccomando un valore 'Interleave' di circa 5.)

Al momento della stesura dello scritto lo strumento funziona bene con Chrome, Safari e (tramite uno shim) Firefox; IE9 non supporta i cursori di input dell'intervallo HTML5, che l'interfaccia utente utilizza estensivamente per l'esplorazione interattiva.