2010-06-02 26 views
5

Ici, nous avons une exigence intéressante d'algorithme du monde réel impliquant les couleurs.Algorithme de couleur aléatoire stable

  1. NPretty Colors: Pour dessiner une belle carte (i.e.: camembert) nous devons choisir un ensemble aléatoire de N couleurs qui sont « assez différentes » et bien ensemble. Cela pourrait être accompli en fixant la luminosité et la saturation et en passant par la teinte par étapes de 360/N.
  2. Stable Color Assignment: étant donné Pie_1 avec les secteurs étiquetés ('A', 'B', 'C') et Pie_2 avec les secteurs étiquetés ('B', 'C', 'D'), ce serait bien si la couleur des secteurs B et C est la même sur Pie_1 et Pie_2. Cela aidera à éviter la confusion si des secteurs sont supprimés ou ajoutés au graphique au fil du temps. L'étiquette est la seule chose stable.
  3. Autorise les couleurs codées en dur: L'algorithme doit autoriser les relations label-> color en tant qu'entrée mais calcule les couleurs (conformément aux règles 1 et 2) pour le reste des étiquettes.

Je pense que cet algorithme, même s'il semble assez ad-hoc, sera utile dans plus d'une situation.

Des idées?

Mise à jour: Eric a raison de dire qu'il est impossible de garantir la stabilité des couleurs de chaque étiquette lorsque de nouvelles étiquettes apparaissent et disparaissent. Mais je suis content s'il est "assez stable", c'est-à-dire que les changements de couleur sont minimisés.

Je pensais à quelque chose comme:

  1. Chaque étiquette obtient une valeur de teinte aléatoire à l'aide de hachage (étiquette)% 360
  2. Afin de garantir que les teintes produites sont assez différents, nous divisons la teinte entourez d'un nombre fixe d'étapes (par exemple: 2*N) et essayez d'arrondir les valeurs de teintes précédentes aux nouvelles valeurs différenciées.
  3. Dans le cas de différentes étiquettes allant à la même valeur de teinte arrondie, nous cassons l'attache d'une manière ou d'une autre et déplacons le point ailleurs.

Mais cela laisse de côté le problème des couleurs codées en dur.

Répondre

4

Vous pouvez choisir un ensemble de couleurs aléatoires qui semblent bonnes ensemble en utilisant un algorithme color wheel. Voici un related SO question avec des guides d'implémentation, ou google pour beaucoup d'autres.

Vous pouvez utiliser quelque chose comme un hachage de vos étiquettes comme point de départ sur la roue chromatique pour assurer la stabilité. Cela satisfait également 3. si vous avez un mécanisme de dérogation pour indiquer qu'une valeur de hachage d'étiquette spécifique doit correspondre à un point de départ spécifique sur la roue chromatique.

EDIT:

La roue de couleur vous permet de choisir un point de départ de maître (par exemple (hachage (A)% 360) et veiller à ce que deux autres couleurs (B, C) sont "gentils" lorsqu'ils sont utilisés ensemble avec A B et C sont déterminés par A. Si vous pouvez plus tard avoir un graphique à secteurs (B, Y, Z), B serait défini comme (hash (B)% 360) et serait différent de celui de (A, B, C) cas.

Si vous pouvez mélanger arbitrairement des étiquettes sur des diagrammes circulaires, aucun algorithme ne peut garantir qu'ils seront toujours bien ensemble. Voici une preuve simple:

Soit A, B, C, afin qu'ils soient bien ensemble.

Maintenant, nous allons A apparaissent avec une couleur arbitraire Z

Vous pouvez certainement choisir une couleur pour Z tels que A et Z conflit.

Vous pouvez seulement garantir qu'un certain ensemble de couleurs sera bien ensemble, et que choisir le même ensemble reproduira les mêmes couleurs.

Vous pouvez utiliser le hachage par ex. la première étiquette comme point de départ sur la roue (hachage (A)) ou vous pouvez combiner les hachages (hachage (A) + 31 * hachage (B) + 31 * 31 * hachage (C)). La multiplication par 31 (un nombre premier) est quelque chose du monde de Java qui aide à assurer une meilleure distribution mathématique en combinant plusieurs hachages.

+0

Si nous définissons la couleur (label): = hsb (hash (label)% 360, S, B) fonctionnera mais comment garantir que la teinte est différente. De l'autre côté, si vous utilisez une roue chromatique, quelle étiquette est hachée et commencez la roue chromatique et quelles sont les étiquettes qui suivent? Merci pour votre réponse – Olmo

+0

@Olmo: Voir ma modification. –

+0

ça fait beaucoup Eric. J'ai changé la question en wiki communautaire pour que je puisse répondre avec un peu plus d'espace – Olmo