Entwickler-Ecke

Multimedia / Grafik - Algorithmus für n unterschiedliche Farben (RGB-Werte)


ähM_Key - Di 02.05.06 17:47
Titel: Algorithmus für n unterschiedliche Farben (RGB-Werte)
Hi!

Ich möchte ein Diagram mit n Kurven erstellen. Damit man diese unterscheiden kann sollen sie n unterschiedliche Farben haben. Nun bin ich auf der Suche nach einem Algo, womit man die RGB-Werte dieser Farben erhält.
Einen Farbverlauf von r über g und b nach r habe ich schon realsiert, jedoch die Anteile der Farbkomponenten mit einer Sinus-Kurve angenähert, wodurch es nicht ganz so schön aussieht wie bei einem 'normalen', üblichen Farbverlauf, um den Haufen an an Fallunterscheidungen zu umgehen.

Nun wollte ich die Farben in gleichmäßigen Abständen aus dem Farbband wählen.

Als Ergbenis wollte ich sowas haben wie:
n=3: rot, grün, blau
n=6: rot, gelb, grün, türkis, blau, lila
usw... (n € N)

Jemand ne Idee, wie man das (einfach) besser hinbekommen kann als mit dem Sinus; oder gibts so nen Algo schon fertig (vielleicht auf ne ganz andere Art und Weise).

Dank, Gruß, ähM_Key

PS: Das Forum war grade ganz schön lahm bzw. kurzzeitig unerreichbar oO


Master_of_Magic - Di 02.05.06 18:27

Hallo ähM_Key,

Ich hab mich auch mal vor einiger Zeit mit dem Problem beschäftigt und hab mir nen einfachen Algo geschrieben. Dabei wird aus dem Farbraum von Rot bis Lila (Regenbogen) in regelmäßigen Abständen eine Farbe entnommen.
Meine ist sicherlich nicht die eleganteste Lösung, jedoch erfüllt er meiner Meinung nach ihren Zweck :wink: :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
procedure TForm1.listColors(anzahl:integer);
var number,red,green,blue,i:integer;
step:real;
begin
  RichEdit.Clear;
  step:=1275/(anzahl-1);

  for i:=0 to anzahl-1 do
  begin
    number:=round(i*step);
    red:=0;
    green:=0;
    blue:=0;

    case number of
    0..255:
      begin
        red:=255;
        green:=number;
      end;
    256..510:
      begin
        red:=510-number;
        green:=255;
      end;
    511..765:
      begin
        green:=255;
        blue:=number-510;
      end;
    766..1020:
      begin
        green:=1020-number;
        blue:=255;
      end;
    1021..1275:
      begin
        red:=number-1020;
        blue:=255;
      end;
    1276:
      begin
        red:=255;
        blue:=255;
      end;
    end;

    Richedit.SelAttributes.Color:=rgb(red,green,blue);
    Richedit.Lines.Add('#'+inttohex(red,2)+inttohex(green,2)+inttohex(blue,2));
  end;
end;


Ich hab noch ein paar Änderungen vorgenommen, der Code müsste aber noch funktionieren.


ähM_Key - Di 02.05.06 18:48

Joa, sieht gut aus, thx!

MK