Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Allgorithmus RGB Colors erzeugen funzt nicht!


JRegier - Di 26.07.05 18:07
Titel: Allgorithmus RGB Colors erzeugen funzt nicht!
Hi, kennt jemand ein besseren Algorithmus mit dem man einige Farben im bestimmten Helligkeitsbereich
erzeugen kann? Ich habe hiermit versucht und es sind alles Graue Farben! Ich möchte eigentlich eine
schön bunt gemischte Pallete haben!


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:
var FColor array[0..25or TColor;

procedure TDBBuilderFrame.InitColorArray;
var  I, R, G, B : Integer;
begin
    R := 150;
    G := 150;
    B := 150;
    I := 0;
    while R <= 200 do
    begin
        while G <= 200 do
        begin
            while B <= 200 do
            begin
            FColor[I] := RGB(R, G, B);
            Inc(I);
            Inc(B, 2);
            end;
        Inc(G,2);
        end;
    Inc(R, 2);
    end;
end;


AXMD - Di 26.07.05 18:39

Richtig gut kommentiert der Code :gruebel: Was soll der machen? Farben erzeugen? Nach welchen Kriterien (was verstehst du unter einem "Helligkeitsbereich")? Dass du nur Grautöne erhältst, ist klar: R, B und G haben immer den gleichen Wert -> Graustufenpallette.

AXMD


DaRkFiRe - Di 26.07.05 19:13

Schau dir das HSL Farbmodell an...

Ach übrigens:

"...or TColor"???


JRegier - Di 02.08.05 08:17

Hey Jungs hier so sieht der Code jetzt aus:


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:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
procedure TColorMan.CreateManyColors(const Value: Integer);
const Senken = 1;
      Steigen = 2;
      Stehen = 3;
      UGrenz = 15;
      OGrenz = 240;
var R, G, B, C, I : Integer;
    RT, GT, BT : Byte;
    R0, R1, G0, G1, B0, B1 : Boolean;
begin
   FColorCount := Value;
   SetLength(FColors, Value);

   R := OGrenz;
   G := UGrenz;
   B := UGrenz;
   RT := Senken;
   GT := Steigen;
   BT := Stehen;

   C := ((OGrenz - UGrenz) div (Value-1)) * 5;
   for I := 0 to Value - 1 do
   begin
   FColors[I] := RGB(R, G, B);

   case RT of
   Senken:   Dec(R, C);
   Steigen:  Inc(R, C);
   Stehen:   GT := Senken;
   end;

   case GT of
   Senken:  Dec(G, C);
   Steigen: Inc(G, C);
   Stehen:
   end;

   case BT of
   Senken: Dec(B, C);
   Steigen: Inc(B, C);
   Stehen:
   end;

   R1 := R >= OGrenz;
   R0 := R <= UGrenz;

   G1 := G >= OGrenz;
   G0 := G <= UGrenz;

   B1 := B >= OGrenz;
   B0 := B <= UGrenz;

   if(R0) and (G1) and (B0)then
   begin
   RT := Steigen;
   GT := Stehen;
   BT := Stehen;
   end;

   if(R1) and (G1) and (B0)then
   begin
   RT := Stehen;
   GT := Senken;
   BT := Steigen;
   end;

   if(R1) and (G0) and (B1)then
   begin
   RT := Senken;
   GT := Stehen;
   BT := Stehen;
   end;

   if(R0) and (G0) and (B1)then
   begin
   RT := Stehen;
   GT := Steigen;
   BT := Senken;
   end;

   end;
end;


Vieleicht hätte einer die Idee wie man das hier noch verbessern könnte?
Da sind nämlich zu viele Grüntöne hintereinander!

Im Anhang könnt Ihr sehen welche Farben es erzeugt!


Heiko - Di 02.08.05 08:41

Verrate uns erstmal was die Prozedur machen soll. Soll di9e eine Fareb aufhellen? Oder was sonst? Solange wir die Infos nicht haben können wir dir nicht helfen.


JRegier - Di 02.08.05 09:23

user profile iconHeiko hat folgendes geschrieben:
Verrate uns erstmal was die Prozedur machen soll. Soll di9e eine Fareb aufhellen? Oder was sonst? Solange wir die Infos nicht haben können wir dir nicht helfen.


Eine bunte Farbpalette erzeugen die gut sichtbar sind auf Weiß in meinem Falle!

Also kurz gesagt die Farben die Ihr sehen könnt die werden mit dieser procedur
ertzeugt un im array der größe die ich der procedure als parameter übergebe
abgelegt!

Also mein Algorithmus gibt zu viele Grüntöne an einer stelle aus, wenn Ihr
ne Idee habt wie ich noch mehr bunte Farben da rausbekomme? Ich denke das
Spektrum ist doch größer?

Also ich habe zuerst Rot mit 240 initialisiert, grün und blau mit 15 dann
übergebe ich der procedur die anzahl der Farben die erzeugt werden sollen
das wird dann in Schritte aufgeteilt mit denen die Farben als Binärcode
abgebildet die Farben nacheinander runter und hochgefahren werden um
alle Bitcombinationen zu bekommen! Wie mein Code schon aussagt
R0, R1, G0, G1, B0, B1;


LigH - Di 02.08.05 21:49

Der Ausdruck "bunt" ist nicht gerade einer von den Worten, die sich klar und eindeutig definieren lassen. Was du meinst, ist sicherlich, dass du gern verschiedene kräftige, satte Farben in deiner Palette haben möchtest.

Wie DaRkFiRe schon sagte: Das HLS-Farbmodell ist dafür ein sehr guter Ansatz: Man wähle eine hohe Sättigung (S = Saturation), eine mittlere Helligkeit (L = Luminance), und lasse den Farbton (H = Hue) verändern. Eigentlich ist das ein Farbkreis zwischen 0° und 360°, aber weil das über den Wertebereich von "Byte" hinausgeht, werden Werte zwischen 0 und 240 zugelassen, also eine Skalierung von 2/3.

H = 0: rot
H = 40: gelb
H = 80: grün
H = 120: blaugrün
H = 160: blau
H = 200: violett
H = 240: rot

Und dafür gibt es die "function ColorHLSToRGB(Hue, Luminance, Saturation: Word): TColorRef;" in der Unit "GraphUtil".

Viel Spaß!


JRegier - Mi 03.08.05 09:29

user profile iconLigH hat folgendes geschrieben:
Der Ausdruck "bunt" ist nicht gerade einer von den Worten, die sich klar und eindeutig definieren lassen. Was du meinst, ist sicherlich, dass du gern verschiedene kräftige, satte Farben in deiner Palette haben möchtest.

Wie DaRkFiRe schon sagte: Das HLS-Farbmodell ist dafür ein sehr guter Ansatz: Man wähle eine hohe Sättigung (S = Saturation), eine mittlere Helligkeit (L = Luminance), und lasse den Farbton (H = Hue) verändern. Eigentlich ist das ein Farbkreis zwischen 0° und 360°, aber weil das über den Wertebereich von "Byte" hinausgeht, werden Werte zwischen 0 und 240 zugelassen, also eine Skalierung von 2/3.

H = 0: rot
H = 40: gelb
H = 80: grün
H = 120: blaugrün
H = 160: blau
H = 200: violett
H = 240: rot

Und dafür gibt es die "function ColorHLSToRGB(Hue, Luminance, Saturation: Word): TColorRef;" in der Unit "GraphUtil".

Viel Spaß!


Hey Junior-Member und mehr Ahnung als ich? Klasse! :wink: Aber in Wircklichkeit wahrscheinlich kein Junior-Member! Hmm...
Vielen Dank :!:


Gausi - Mi 03.08.05 09:59

[OT] Es soll ja Leute geben, die haben sich schon vor ihrem Beitritt ins Delphi-Forum mit diversen Dingen beschäftigt, die mit Programmieren zu tun haben. Die Anzahl der Beiträge sagt also nicht unbedingt etwas über den Wissensstand des Verfassers ab.
Aber das ändert sich ja sowieso bald :mrgreen:
[/OT]


LigH - Mi 03.08.05 12:05

Na ja - Dipl.-Inform. (FH), zwischendurch auch schon mal Software-Entwickler gewesen. Wird heute aber immer schwerer, noch was zu finden, wenn man nicht wirklich alles kann. Und man wird teilweise nur noch ausgenutzt: Zuletzt war ich (zumindest was den Code angeht) fast ein 1-Mann-Team, 50-Stunden-Woche ohne Überstunden-Ausgleich, und trotzdem der "Chef" immer unzufrieden. So siehste mit 30 schon ganz alt aus...


JRegier - Mi 03.08.05 12:34

user profile iconLigH hat folgendes geschrieben:
Na ja - Dipl.-Inform. (FH), zwischendurch auch schon mal Software-Entwickler gewesen. Wird heute aber immer schwerer, noch was zu finden, wenn man nicht wirklich alles kann. Und man wird teilweise nur noch ausgenutzt: Zuletzt war ich (zumindest was den Code angeht) fast ein 1-Mann-Team, 50-Stunden-Woche ohne Überstunden-Ausgleich, und trotzdem der "Chef" immer unzufrieden. So siehste mit 30 schon ganz alt aus...


Was ist wenn du z.B. gute Ideen hast und die privat umsetzen kannst, demzufolge auch gut verkaufen kannst (alles eine Frage einer guten Idee)
und aber nicht das Risiko eingehen willst sich in die Selbständigkeit stürzen! Suchst also einen Chef der dich als sozusagen Subunternehmer
einstellt (weil er ja nur Vorteile dadurch hät und etwas dazuverdienen kann) der Chef übernimmt für dich dann die Rentenbeiträge
(apropo Rentenversicherung es heist zwar ...versicherung aber ist es nicht! Ist nur ein Rentenbeitrag in dem Sinne "aber darüber kann man ja
in einem anderen Thread diskutieren) und Krankenversicherung etc. und du bist dein eigener Chef und kannst deine eigene Ideen umsetzen! :idea: