Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Farbwerte je nach Zahlenwert (https://www.delphipraxis.net/126578-farbwerte-je-nach-zahlenwert.html)

Flips 28. Dez 2008 19:50


Farbwerte je nach Zahlenwert
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

tut mir Leid, mir ist nichts Besseres für den Titel eingefallen, daher konnte ich auch nur schwer danach suchen, weil ich es schlecht beschreiben kann.
Gegeben ist ein 2D-Array mit Zahlenwerten, sagen wir von 0 bis 10 ist alles dabei (auch rationale Zahlen, im Beispiel lass ich die Weg)
Beispielarray:
Code:
10 8 4 1 0
8  8 4 1 0
4  4 3 1 0
1  1 1 0 0
0  0 0 0 0
So, und ich will nun sowas haben, wie im Anhang, quasi eine farbliche Darstellung.
d.h. wenn der Zahlenwert nah am Maximum ist, dann mach ihn eher rot, wenn nicht eher grün.
Mit welchen Farben spielt im Prinzip keine Rolle.

Wie nennt man das, was ich haben will, bzw. wonach soll ich suchen?
Oder hat jemand ein paar Tipps für mich, wie ich das realisieren könnte? Steh da nämlich grad echt auf dem Schlauch, hatte das Problem vor Urzeiten schonmal.
Danke,
lg Flips

Klaus01 28. Dez 2008 20:14

Re: Farbwerte je nach Zahlenwert
 
Guten Abend Philip,

ein erster Ansatz wäre es ersteinmal das Maximum des Array
und die Anzahl der verschieden Werte zu ermitteln.
Also die Werte des Array sortieren.

Dem Maximum gibst Du dann den Wert rot.
Den nachfolgenden Werten die nachfolgenden Farben.

Grüße
Klaus

bigben37 28. Dez 2008 20:20

Re: Farbwerte je nach Zahlenwert
 
Nachdem die die Farbe bekommen hast, kannst du ja ganz einfach mit einer doppelten For-Schleife den Array durchgehen und zeichnen.

Edit: Falls du damit Probleme haben solltest, schreibs einfach, ich hab schon grad mal ne Demo geschrieben. :stupid:

Flips 28. Dez 2008 20:23

Re: Farbwerte je nach Zahlenwert
 
Hi,
danke für die Antworten.
Aber dafür müsste ich ja pro Zahlenwert eine Farbe festlegen. Klar, bei 10 Zahlen würde das gehn, aber ich rede hier auch von allen möglichen rationalen Zahlen.
10 Zahlen 10 Farbwerte zuzuordnen, dafür würd ich glaub dann doch keinen Thread aufmachen :-D

Ich bräuchte eher eine Formel, die je nach Größe der Zahl die passende Farbe ausspuckt, abhängig von zwei vorgegebenen Farben für Minimum und Maximum und halt dem Maximalwert/Minimalwert.

bigben37 28. Dez 2008 20:29

Re: Farbwerte je nach Zahlenwert
 
Ich hab hier mal ein Beispiel, ganz zu frieden bin ich damit noch nicht und es kann sicher noch ausgebaut werden (Es wird angenommen, dass das Minimum 0 ist):

Delphi-Quellcode:
function TForm1.MakeColor(i, max: Integer): TColor;
var
  r, g, b: Integer;
begin
  r := Round(255 * (i / max));
  g := 255 - r;
  b := 0;
  Result := RGB(r, g, b);
end;
Wenn der Wert maximal ist, wirds rot, wenn er minimal ist, wirds grün.

Hawkeye219 28. Dez 2008 21:10

Re: Farbwerte je nach Zahlenwert
 
Hallo Philipp,

wenn du deine Zahlenwerte auf den Bereich [0..1] normierst, hilft dir beim Darstellen vielleicht die folgende Routine. Ich stand vor einiger Zeit mal vor einem ähnlichen Problem.

Delphi-Quellcode:
// aColors   Array mit den zu verwendenden Farben
// aPosition normierte Position innerhalb des Arrays [0..1]
// aDefault  Farbwert für Positionen außerhalb des Arrays
function IntermediateColor (
           const aColors  : array of TColor;
                 aPosition : Double;
                 aDefault : TColor = $808080
         ) : TColor;
type
  PRGBA = ^TRGBA;
  TRGBA = packed record r, g, b, a : Byte end;
var
  Index : Integer;
  C1, C2 : TRGBA;
  Ratio : Double;
begin
  if (Length(aColors) = 0) then
    Result := IfThen(aDefault = clNone, clGray, aDefault)
  else if (Length(aColors) = 1) then
    Result := aColors[0]
  else if (((aPosition < 0.0) or (aPosition > 1.0)) and (aDefault <> clNone)) then
    Result := aDefault
  else
    begin
      Ratio := High(aColors) * Max(0.0, Min(1.0, aPosition));
      Index := Trunc(Ratio);
      Ratio := Frac(Ratio);

      if (Index = High(aColors)) then
        begin
          Dec (Index);
          Ratio := Ratio + 1.0;
        end;

      C1 := TRGBA(ColorToRGB(aColors[Index]));
      C2 := TRGBA(ColorToRGB(aColors[Index + 1]));

      TRGBA(Result).r := C1.r + Trunc(Ratio * (C2.r - C1.r));
      TRGBA(Result).g := C1.g + Trunc(Ratio * (C2.g - C1.g));
      TRGBA(Result).b := C1.b + Trunc(Ratio * (C2.b - C1.b));
      TRGBA(Result).a := 0;
    end;
end;
Die zu verwendenden Farben werden als Array übergeben, du kannst also auch mehr als zwei Farben verwenden:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
type
  TDynColorArray = array of TColor;
var
  i       : Integer;
  Position : Double;
  ColorMap : TDynColorArray;
begin
  ColorMap := TDynColorArray.Create(clRed, clBlue, clYellow, clGreen);

  for i := 0 to Width - 1 do
    begin
      Position := i / (Width - 1);
      Canvas.Pen.Color := IntermediateColor(ColorMap, Position);
      Canvas.MoveTo (i, 0);
      Canvas.LineTo (i, 50);
    end;
end;
Beachte, dass die Funktion die Unit Math benötigt.

Gruß Hawkeye

Flips 29. Dez 2008 14:14

Re: Farbwerte je nach Zahlenwert
 
Danke euch beiden, ich hab jetzt die erste, kleinere Lösung genommen, ich werde mir die zweite aber mal anschauen :-)
Danke für eure Hilfe!

Flips 29. Dez 2008 17:27

Re: Farbwerte je nach Zahlenwert
 
Ohje jetzt steh ich wieder aufem Schlauch, weiß gar ned was zur Zeit los ist...Liegt bestimmt daran das Ferien sind :-D

Ich wollte das ganze jetzt umschreiben, dass es beim kleinsten Wert rot wird und je höher, desto grüner.
Dachte ich änder einfach r und g, aber irgendwie bringt das nicht den gewünschten Effekt:
Delphi-Quellcode:
function MakeColor(i, min, max: Extended): TColor; //hab kleinsten und größten Wert zur Verfügung
var
  r, g, b: Integer;
begin
  g := Round(255 * (i / max));
  r := 255 - g;
  b := 0;
  Result := RGB(r, g, b);
end;
Ich komm einfach nich von dem .... Schlauch runter oO

Hawkeye219 29. Dez 2008 17:48

Re: Farbwerte je nach Zahlenwert
 
Hallo Philipp,

wen das Minimum deiner Daten von Null verschieden ist, muss die Formel zur Berechnung des Grün-Anteils so aussehen:

Delphi-Quellcode:
g := Round(255 * (i - min) / (max - min));
Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:43 Uhr.

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