2010-06-02 15 views
5

Hier haben wir eine interessante Real-Welt-Algorithmus-Anforderung, die Farben beinhaltet.Stabiler zufälliger Farbalgorithmus

  1. NHübsche Farben: Um eine schöne Grafik zu zeichnen (das heißt: Tortendiagramm) brauchen wir einen zufälligen Satz von N Farben auszuwählen, die „anders genug“ sind und zusammen gut aussehen. Dies könnte erreicht werden, indem Helligkeit und Sättigung festgelegt werden und der Farbton in Schritten von 360/N schrittweise durchlaufen wird.
  2. Stabile Farbzuweisung: gegeben Pie_1 mit Sektoren beschriftet ('A', 'B', 'C') und Pie_2 mit Sektoren beschriftet ('B', 'C', 'D'), wäre es nett wenn die Farbe der Sektoren B und C in Pie_1 und Pie_2 gleich ist. Dies hilft, Verwirrung zu vermeiden, wenn Sektoren im Laufe der Zeit entfernt oder dem Diagramm hinzugefügt werden. Das Etikett ist das einzige stabile Ding.
  3. Erlaubt hartcodierte Farben: Der Algorithmus sollte hartcodierte Label-> Farbbeziehungen als Eingabe zulassen, berechnet aber Farben (gemäß Regel 1 und 2) für die restlichen Beschriftungen.

Ich denke, dass dieser Algorithmus, auch wenn er ziemlich ad hoc aussieht, in mehr als einer Situation nützlich sein wird.

Irgendwelche Ideen?

Update: Eric ist richtig, dass es unmöglich ist, die Stabilität der Farben für jedes Etikett zu garantieren, wenn neue Etiketten erscheinen und verschwinden. Aber ich bin glücklich, wenn es "stabil genug" ist, d. H. Farbänderungen werden minimiert.

Ich dachte an so etwas wie:

  1. Jedes Etikett bekommt einen zufälligen Wert Farbton mit Hash (Label)% 360
  2. Um zu gewährleisten, dass die erzeugten Farbtöne genug verschieden sind, teilen wir den Farbton Kreis in einer festen Anzahl von Schritten (zB: 2*N) und versuchen, die vorherigen Farbtonwerte zu den neuen differenzierten 'runden'.
  3. Im Fall, dass verschiedene Labels den gleichen gerundeten Farbtonwert haben, brechen wir die Bindung irgendwie und verschieben den Punkt woanders hin.

Aber das lässt das Problem der hartcodierten Farben beiseite.

Antwort

4

Sie können eine Reihe zufälliger Farben auswählen, die zusammen mit einem color wheel Algorithmus gut aussehen. Hier ist ein related SO question mit Implementierungshilfen oder Google für viele andere.

Sie können etwas wie einen Hash Ihrer Etiketten als Ausgangspunkt auf dem Farbrad verwenden, um Stabilität zu gewährleisten. Dies erfüllt auch 3. Wenn Sie einen Override-Mechanismus haben, der besagt, dass ein bestimmter Label-Hash-Wert einem bestimmten Startpunkt im Farbrad entsprechen soll.

EDIT:

Das Farbrad man einen Master-Startpunkt (zB (hash (A)% 360) und sorgen dafür, dass zwei andere Farben (B, C) ist "schön", wenn sie mit A zusammen verwendet werden kann Pick B und C werden durch A bestimmt. Wenn Sie später ein Tortendiagramm (B, Y, Z) haben können, würde B als (hash (B)% 360) gesetzt werden und wäre anders als in (A, B, C) Fall.

Wenn Sie Etiketten auf Tortendiagrammen beliebig mischen können, kann kein Algorithmus sicherstellen, dass sie immer gut zusammen aussehen. Hier ist ein einfacher Beweis:

Lassen Sie A, B, C ausgewählt werden, so dass sie zusammen gut aussehen.

Nun lassen Sie A mit einer beliebigen Farbe Z erscheinen

Sie sicherlich etwas Farbe für Z holen kann, so dass A und Z kollidieren wird.

Sie können nur garantieren, dass ein bestimmter Satz von Farben zusammen gut aussieht und dass die Auswahl desselben Satzes die gleichen Farben reproduziert.

Sie können den Hash von z. die erste Marke als Startpunkt auf dem Rad (Hash (A)) oder Sie können die Hashes kombinieren (Hash (A) + 31 * Hash (B) + 31 * 31 * Hash (C)). Multiplikation mit 31 (eine Primzahl) ist etwas aus der Java-Welt, das hilft, eine bessere mathematische Verteilung sicherzustellen, wenn mehrere Hashes kombiniert werden.

+0

Wenn wir Farbe (Label) definieren: = hsb (Hash (Label)% 360, S, B) funktioniert, aber wie garantieren Sie, dass der Farbton unterschiedlich ist. Auf der anderen Seite, wenn Sie ein Farbrad verwenden, welches Label ist hashed und starten Sie das Farbrad und which Etiketten sind nur Anhänger? Danke für Ihre Antwort – Olmo

+0

@Olmo: Siehe meine Bearbeitung. –

+0

thaks viel Eric. Ich habe die Frage in das Community-Wiki geändert, damit ich mit etwas mehr Platz antworten kann – Olmo