Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Werte farblich darstellen (https://www.delphipraxis.net/45592-werte-farblich-darstellen.html)

Luckie 9. Mai 2005 00:48


Werte farblich darstellen
 
Ich habe Wert, sagen wir von 1 bis 200, diese möchte ich nun farblich darstellen, wie man es von Temperaturen kennt: niedrige Temperaturen blau über gelb, orange zu rot für warme Temperaturen.

Das:
Delphi-Quellcode:
    case cnt of
      0: StringGrid1.Canvas.Brush.Color := clWhite;
      1..10: StringGrid1.Canvas.Brush.Color := clNavy;
      11..20: StringGrid1.Canvas.Brush.Color := clBlue;
      21..30: StringGrid1.Canvas.Brush.Color := clGreen;
      31..40: StringGrid1.Canvas.Brush.Color := clLime;
      41..50: StringGrid1.Canvas.Brush.Color := clYellow;
      51..60: StringGrid1.Canvas.Brush.Color := cl
    else
      StringGrid1.Canvas.Brush.Color := clRed;
    end;
liefert nur sehr unbefridigende Resultatet. Hat jemand eine Funktion zu Hause rumliegen, die mir in Abhängigkeit des Wertes eine passenden Farbe liefert?

Danke schon mal für eure Mühe.

alcaeus 9. Mai 2005 00:54

Re: Werte farblich darstellen
 
Hallo Luckie,

du koenntest einen Farbverlauf von gruen ueber blau zu gelb, dann orange und Rot machen, und diesen in 200 Stufen aufteilen. Dazu hatten wir erst letztens was (Hier im Forum suchenTGradient).
Anschliessend nimmst du einen der 200 Werte her. Mit etwas Planung laesst sich dies auch beliebig erweitern, so dass du nicht auf 200 Werte beschraenkt bist.

Greetz
alcaeus

Luckie 9. Mai 2005 01:02

Re: Werte farblich darstellen
 
TGradient ist nicht unbedingt das, was ich suche. Ich bräuchte mehr eine Formel die mir zu einem Wert zwischen 1 und 200 eine passenden Farbe liefert.

So was irgendwie:
Delphi-Quellcode:
StringGrid1.Canvas.Brush.Color := (10*cnt+10*cnt+10*cnt);
Nur hier stimmt natürlich die Gewichtung der Frabanteile nicht. Nur leider habe ich von Farben und der Theorie dazu keine richtige Ahnung.

neolithos 9. Mai 2005 01:20

Re: Werte farblich darstellen
 
RGB ist ein additives Farbsystem.
Um nun eine Abstufung zu ermitteln Bildet man einfach nur den Zwischenwert mittels Verhältnisgleichung:
Delphi-Quellcode:
function GetMixColor(adwStartColor, adwStopColor : Cardinal; afPos : Extended) : Cardinal;
  function Clc(abStart, abStop : Byte) : Byte;
  begin
    Result := abStart + Round((abStop - abStart) * afPos);
  end;
begin
  Result := Rgb(Clc(GetRValue(adwStartColor), GetRValue(adwStopColor)),
                Clc(GetGValue(adwStartColor), GetGValue(adwStopColor)),
                Clc(GetBValue(adwStartColor), GetBValue(adwStopColor)));
end;
So könnte das zum Bsp aussehen.

btw.: Die Funktion selber ist etwas langsam und könnte etwas Tuning vertragen.

Luckie 9. Mai 2005 01:25

Re: Werte farblich darstellen
 
Das Problem ist, ich habe keine Anfangs- und Endfarbe. Wenn ich 1 habe soll die Farbe tief blau, bei 75 grün, bei 150 gelb/orange und bei 200 dunkel rot sein. Und dazwischen eben schön mit den Zwischenstufen.

Kommando zurück, das ist natürlcih die Lösung ich Depp. :wall:

neolithos 9. Mai 2005 01:33

Re: Werte farblich darstellen
 
Dazu musst du deine Bereich unterteilen.

Delphi-Quellcode:
1..75: Result := GetMixColor(Rgb(0, 0, 255), Rgb(0, 255, 0), (i - 1) / 75);
76..150: Result := GetMixColor(???, ???, (i - 76) / 75);
151..200: Result := GetMixColor(???, Rgb(255, 0, 0), (i - 151) / 50);[/delphi]

??? - leider weis ich die Farbwerte um diese Zeit nicht mehr.

Luckie 9. Mai 2005 01:46

Re: Werte farblich darstellen
 
Nein, muss ich nicht. Anfangswert ist 1 und Endwert ist 200 und fPos wäre bei mir cnt.

Allerdings bringt diese hier http://www.delphi-forum.de/viewtopic.php?p=221577 bessere Resultate wenn man con clYellow nach clGreen geht und für Anzahl 175 angibt. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:40 Uhr.

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