2009-04-21 23 views
17

Je souhaite dessiner des données dans une texture: plusieurs éléments d'affilée. Ils ne sont pas créés dans l'ordre, et ils peuvent tous être de tailles différentes (pensez à un tas de mémoire). Chaque élément de données est un petit rectangle et je veux être capable de les distinguer, donc j'aimerais que chacun d'eux ait une couleur unique.Générer des couleurs uniques

Maintenant, je pourrais juste utiliser rand() pour générer des valeurs RVB et espérer qu'ils sont tous différents, mais je suppose que je ne vais pas obtenir une bonne distribution dans l'espace RVB. Y a-t-il un meilleur moyen que cela? Par exemple. Qu'est-ce qu'une bonne façon de faire du vélo à travers différentes couleurs avant de (presque) répéter?

Les couleurs ne doivent correspondre à aucune donnée dans les éléments. Je veux juste pouvoir regarder beaucoup de valeurs et voir qu'elles sont différentes, car elles sont adjacentes.

Je pourrais trouver quelque chose mais je pense que c'est une question intéressante. :)

+0

c'est vrai! C'est une question très intéressante :-) – dfa

+0

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

Répondre

13

L'utilisation du modèle de couleurs RVB n'est pas un bon moyen d'obtenir un bon mélange de couleurs. Il est préférable d'utiliser un autre modèle de couleur pour générer votre couleur, puis de convertir ce modèle de couleur en RVB.

Je vous suggère le modèle de couleur HSV or HSL à la place, en particulier vous voulez faire varier le Hue.

Si vous voulez des valeurs de couleur différente X, les varier de 0 à 360 avec un pas de 360 ​​divisé par X.

+1

0, 360 (mêmes couleurs), 180 , 300, 390, 102, 162, 213, 258, 298 (fondamentalement 300 à nouveau), 334, 367, (fondamentalement 360 une troisième fois). – Tatarize

2

Quel est votre espace d'échantillon ... combien d'articles sont nous parlons.

Vous pouvez construire un tableau de RVB 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 

Puis randomiser votre liste et itérer à travers elle. qui vous donnerait 16^3 (4096) couleurs différentes avant une couleur répétée.

+0

Cela est identique à rand (0,16) << 20 | rand (0,16) << 12 | rand (0,16) << 4. C'est une couleur aléatoire entre # 000 et #FFF en couleur 12 bits, en vérifiant les répétitions. Vos # 0A0 et # 090 par exemple en particulier avec les distinctions de couleur avec les verts vont sembler assez identiques. – Tatarize

4

En général, le RVB n'est pas un bon espace de couleur pour faire ce genre de choses car il est perceptivement non linéaire, pour commencer. Cela signifie que les distances égales déplacées entre les triplets RGB ne semblent pas également différentes à nos yeux.

Je travaillerais probablement dans l'espace L*c*h* (see also), ou HSL, et générerais juste un espacement uniforme dans la teinte. Ces espaces ont été conçus pour être approximativement linéairement perceptuellement.

+2

Même dans HSL, l'espacement régulier de 'hue' est [pas perceptivement linéaire] (http://phrogz.net/tmp/colordifferences). – Phrogz

+1

HSL est une conversion mathématique directe de RGB quelle que soit la teinte particulière. Les espaces ne sont pas conçus pour être linéaires. La LCH est une modification de LAB qui nécessite en réalité un streatching basé sur la teinte pour mieux s'adapter à l'œil humain. – Tatarize

0

Ceci est très similaire au problème quatre couleurs relatives aux cartes de coloration, cela pourrait donner des solutions intéressantes pour vous:

Four colour theorem

+2

Ce n'est vraiment pas du tout semblable au problème des 4 couleurs. Nick utilise autant de couleurs que nécessaire, alors que les problèmes de coloration essaient de minimiser le nombre de couleurs dont vous avez besoin .... – simon

+0

En fait, cela n'a rien à voir avec le problème des 4 couleurs, où seules 4 couleurs sont nécessaires et seulement utilisées comme "tags". Il s'intéresse ici aux qualités optiques (similitude) des couleurs sélectionnées. – Hejazzman

+1

Je ne suis pas d'accord, je pense qu'il y a du mérite dans le problème des 4 couleurs ici. Le problème est de distinguer les éléments disposés dans un plan 2D en utilisant la couleur. Le problème des 4 couleurs prouve que vous pouvez * résoudre * le problème en utilisant seulement 4 couleurs contrastantes. –

2

Google "delta e 2000 cie"; la formule de différence de couleur est utile pour déterminer la distance (visuelle) apparente entre deux couleurs. (Sur un moniteur, il y a une formule différente pour les pigments.) Il fonctionne sur les couleurs dans l'espace Lab (props to simon), mais applique un calcul perceptuel de la différence.

Nous avons constaté qu'un certain nombre d'environ 1,5 était suffisant pour assurer visuellement distinctes couleurs (vous pouvez dire la différence si elles sont l'un près de l'autre), mais si vous voulez identifiables couleurs (vous pouvez trouver toutes les couleurs dans une légende), vous aurez besoin de bosse cela. Comme pour créer un ensemble de couleurs ...

Je commencerais probablement à un coin de l'espace Lab, et je marcherais autour en utilisant une taille de pas qui donne des différences visuelles assez grandes (note: ce n'est pas linéaire, donc la taille de pas devra probablement être adaptative) puis randomiser la liste.

0

Si vous avez juste besoin d'un ensemble de couleurs perceptuels distinctes (et non un algorithme pour les générer) J'ai créé un outil gratuit sur mon site qui fait exactement cela:
http://phrogz.net/css/distinct-colors.html

Au lieu d'utiliser même espacement dans l'espace RVB ou HSV (qui ne sont pas uniformément distribués par rapport à la perception humaine) l'outil vous permet de générer une grille de valeurs dans l'espace HSV et utilise ensuite la norme CMC(I:c) pour la distance de couleur pour jeter les couleurs perceptivement trop proches l'un à l'autre. (Le curseur 'seuil' sur le deuxième onglet vous permet de contrôler la façon dont les couleurs doivent être visuellement distinctes, en vous montrant les résultats en temps réel.)

Finalement, vous pouvez trier votre liste de couleurs générées selon divers critères, puis mélangez uniformément cette liste pour vous assurer d'avoir des valeurs visuellement distinctes adjacentes les unes aux autres dans la liste. (Je recommande une valeur 'Interleave' d'environ 5.)

A partir de cette écriture, l'outil fonctionne bien avec Chrome, Safari et (via un shim) Firefox; IE9 ne prend pas en charge les curseurs d'entrée de gamme HTML5, que l'interface utilisateur utilise intensivement pour l'exploration interactive.

Questions connexes