![]() |
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:
So, und ich will nun sowas haben, wie im Anhang, quasi eine farbliche Darstellung.
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 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 |
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 |
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: |
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. |
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:
Wenn der Wert maximal ist, wirds rot, wenn er minimal ist, wirds grün.
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; |
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:
Die zu verwendenden Farben werden als Array übergeben, du kannst also auch mehr als zwei Farben verwenden:
// 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;
Delphi-Quellcode:
Beachte, dass die Funktion die Unit Math benötigt.
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; Gruß Hawkeye |
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! |
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:
Ich komm einfach nich von dem .... Schlauch runter oO
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; |
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:
Gruß Hawkeye
g := Round(255 * (i - min) / (max - min));
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:51 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