Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Farbexperten: Farbwerte für Segmentierung finden (https://www.delphipraxis.net/167593-farbexperten-farbwerte-fuer-segmentierung-finden.html)

Jazzman_Marburg 7. Apr 2012 21:35

Farbexperten: Farbwerte für Segmentierung finden
 
Österliche Grüße, Gemeinde!

Vielleicht sind ja nicht alle beim Ostereier Suchen.:stupid:
Mich plagt folgendes Problem, bei dem ich Hilfe von euch bräuchte:
Nehmen wir an, ich möchte einen Strassenabschnitt (oder irgendein anderes Segement, z.B. Karte) in Abhängigkeit der 'Begehungsanzahl' einfärben. D.h. jedemals wenn zehn Autos über dieses Segement gefahren sind, wird die Farbe geändert.
Sowiet auch kein Problem: Wenn die Straße initial schwarz ist, dann wird bei jedem zehntem Auto der RGB Wert folgender maße erhöht:
Farbe := RGB ( altR+10, altG+10, altB+10). D.h. die zunächst schwarze Strasse wird imm heller (Grauwert wird erhöht) bis sie schließlich weiss ist.
Mein Problem:
Ich suche ein Algorithmus, der für jede beliebige Farbe so funktioniert. D.h. wenn die Strasse initial rot ist (ClRed), dann soll nach jedem zehntem Auto sich der Farbwert so ändern, dass man als Betrachter eine 'Steigerung' sieht. D.h. bei ClRed könnte man nicht einfach alle drei Kanäle 'hochdrehen' -- mehr als R=255 geht ja dann nicht. Schlimmer noch, wenn initial mit 255, 255, 255 (ClWhite) gestartet wird.

Habt ihr eine Idee, wie man da verfahren würde?

Ich hoffe das Problem ist halbwegs klar: Zu jeder Farbe sollen meintegwegen mind. 10 andere 'gesteigerte' Farben gefunden werden. (Mit 'gesteigert' meine ich halt Farben, die sich von der initialen unterscheiden, aber eben 'stufenweise', so dass der Betrachter es als 'Steigerung' empfindet/sieht).

Sorry, etwas langatmig...
Lieben Dank vorab
Gruß, Jazzman

Popov 7. Apr 2012 21:43

AW: Farbexperten: Farbwerte für Segmentierung finden
 
Guck dir den Thread mal an: http://www.delphipraxis.net/88775-fa...eraendern.html

Aphton 7. Apr 2012 21:44

AW: Farbexperten: Farbwerte für Segmentierung finden
 
Warum soll eine einfache Inkrementierung der Farbkanäle nicht funktionieren? Das einzige, worauf du achten müsstest, ist, dass du den Maximalwert 255 nicht überschreitest...

Edit: Klar, das Inkrementieren der Helligkeit geht in einem anderen System viel einfacher, da nur eine Komponente inkrementiert werden muss.. Aber ich glaube, dass sollte unter RGB auch funktionieren...

Edit2: Wobei blödsinn.. dürfte nicht gehen - (1, 0, 0) (rote Farbe) inkrementiert ergäbe eine ganz andere Farbe.. (und keinen helleren Rot-ton)

Folglich - wandle deine Farbe um, inkrementiere dort die Helligkeit und wandle letztendlich zurück um...

himitsu 7. Apr 2012 21:48

AW: Farbexperten: Farbwerte für Segmentierung finden
 
tja, das Weiß ist dir nun schon aufgefallen, also geht stures Erhöhen sowieso nicht. :angle2:

PS: auch ein clRed kannst du nicht noch röter machen, man könnte höchsten die anderen Werte erhöhen, in Richtung Weiß



Vorschlag:
- für jeden Farbanteil wird bestimmt, ob er hell oder dunkel ist
- um eine Größere farbänderung zu bekommen, würde ich ab 75% (etwa der Wert 200) dieses als Hell ansehn
- helle Werte werden dunkler und dunkle Werte werden heller
- dann berechnest du dir die Schrittgrößen (bei deinen 10 wären das etwa 25 Schritte)
- - Hell: x bis 0
- - Dunkel: x bis 255
- - den Abstand einfach durch 25 teilen
- und nun wird einfach immer wieder die errechnete Schrittweite dazuaddiert oder abgezogen

- entweder du merkst dir die Rechenwerte (z.B. als ShortInt) oder die Initialwerte
- bei Letzerem könnte/müßte man jedesmal die (Diverenz)Werte neu berechnen, aber dafür kann man sehr gut auch mit nicht ganzzahligen Schritten arbeiten

Und natürlich immer aufpassen, daß du nie über 255 oder unter 0 kommst.

Popov 7. Apr 2012 21:53

AW: Farbexperten: Farbwerte für Segmentierung finden
 
@Aphton

Nur bedingt. Kleiner Trick (ohne Gewähr), wenn man das so nennen darf, zwei Farben prozentual mischen, wobei einer der Farben Weiß ist.

//Edit:

Ich hab meine Aussage getestet und auf die Schnelle eine Funktion geprogt die zwei Farben prozentual mischt. Ist eine davon weiß, wird die Farbe heller. Nimmt man als zweite Farbe schwarz, wird es dunkler. Das Ganze scheint irgendwie zu funktionieren.

Delphi-Quellcode:
function ColorMix(Col1, Col2: TColor; PercCol1: Byte): TColor;
var
  R, G, B: Integer;
begin
  if PercCol1 > 100 then PercCol1 := 100;

  R := Round(GetRValue(Col1) + ((GetRValue(Col2) - GetRValue(Col1)) * PercCol1 / 100));
  G := Round(GetGValue(Col1) + ((GetGValue(Col2) - GetGValue(Col1)) * PercCol1 / 100));
  B := Round(GetBValue(Col1) + ((GetBValue(Col2) - GetBValue(Col1)) * PercCol1 / 100));

  Result := RGB(R, G, B);
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  Color := ColorMix($000080FF, clWhite, TrackBar1.Position);
end;

Jazzman_Marburg 7. Apr 2012 22:07

AW: Farbexperten: Farbwerte für Segmentierung finden
 
Zitat:

Zitat von Popov (Beitrag 1160653)

Ja, das sieht ja schon sehr interessant aus -- leider bekomme ich stahlis Projekt nicht zum Laufen:
Mit dem Farbdialog wähle ich eine Farbe, Panel1 übernimmt die Farbe, aber ein Hin-und-Her an der TrackBar verändert nix. :pale:

Hat das jamand ans Laufen bekommen?
(Ich mache bestimmt was falsch -- ich zweifle nicht an stahlis Projekt.)

Vielen Dank erstmal -- dieser Hinweis ist vielversprechend!

Gruß
Jazzman

Namenloser 7. Apr 2012 22:13

AW: Farbexperten: Farbwerte für Segmentierung finden
 
Mein Vorschlag: Logik von Darstellung trennen (originell, ich weiß).

Statt den „Wert“ der Straße direkt als Farbe zu speichern, speicherst du ihn als Wert zwischen 0.0 und 1.0 (über Gleitkommazahlen oder über einen entsprechend skalierten Integer, wie auch immer). Am Ende multiplizierst du einfach die Maximalfarbe mit dem Wert. Dadurch reduzierst du außerdem Rundungsfehler.

Beispiel:
FarbeMaximal = RGB($FF, $00, $00) (100% rot)

Wert = 0.0
-> Farbe = RGB($FF*0.0, $00*0.0, $00*0.0) = RGB($00, $00, $00); (schwarz)

Wert = 0.5
-> Farbe = RGB($FF*0.5, $00*0.5, $00*0.5) = RGB($7F, $00, $00); (dunkelrot)

Wert = 1.0
-> Farbe = RGB($FF*1.0, $00*1.0, $00*1.0) = RGB($FF, $00, $00); (100% rot)

Je nachdem, wie das Mapping verlaufen soll, kannst du den Wert auch vorher potenzieren (Stichwort Gamma). Also z.B.
Delphi-Quellcode:
Wert = Power(Wert, 2.2);
für einen Gammawert von 2.2.

Natürlich kannst du auch, wie schon vorgeschlagen, ein anderes Farbmodell wie HSV statt RGB verwenden, aber imo ist das für diesen Zweck unnötig kompliziert.

Popov 7. Apr 2012 22:15

AW: Farbexperten: Farbwerte für Segmentierung finden
 
Ja, ich hab es zum laufen gekriegt. Das Ganze ist leicht komplex. Da sind paar Beispiele vereint.

Aber teste mal zuerst mein Beispiel. Vielleicht reicht das schon.

Jazzman_Marburg 7. Apr 2012 22:34

AW: Farbexperten: Farbwerte für Segmentierung finden
 
Zitat:

Zitat von Popov (Beitrag 1160668)
Aber teste mal zuerst mein Beispiel. Vielleicht reicht das schon.

Fast!
Das ist ein gutes Beispiel -- vielen Dank -- aber leider nur fast:
Also wenn ich als StartFarbe sowas wie ClYellow, oder ClGreen habe, und als ZielFarbe ClRed funktioniert es ganz wunderbar!
Aber, sobald ich als StartFrabe sowas wie clActiveCaption, oder clGradientInactiveCaption und der gleichen ZielFarbe (ClRed) habe, dann gehts es nimmer so gut: Es startet dann mit Schwarz und geht allmählich ins Rot -- aber ClActiveCaption ist ja nicht Schwarz.
Woher kommt die Farbe Schwarz als StartFarbe sobald es um diese Farben wie clGradientInactiveCaption geht?

Danke!
Jazzman

Namenloser 7. Apr 2012 22:46

AW: Farbexperten: Farbwerte für Segmentierung finden
 
Das liegt daran, dass solche Systemfarben das folgende Format haben:
$XX000000, wobei XX auf den Paletteneintrag verweist.

Wenn du den tatsächlichen Farbwert brauchst, musst du Delphi-Referenz durchsuchenColorToRGB verwenden. Z.B.
Delphi-Quellcode:
ColorToRGB(clActiveCaption);


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:27 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz