AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Farbwerte je nach Zahlenwert
Thema durchsuchen
Ansicht
Themen-Optionen

Farbwerte je nach Zahlenwert

Ein Thema von Flips · begonnen am 28. Dez 2008 · letzter Beitrag vom 29. Dez 2008
Antwort Antwort
Flips

Registriert seit: 17. Feb 2005
Ort: Sankt Wendel
491 Beiträge
 
Delphi 7 Professional
 
#1

Farbwerte je nach Zahlenwert

  Alt 28. Dez 2008, 19:50
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
Angehängte Grafiken
 
Philipp F.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Farbwerte je nach Zahlenwert

  Alt 28. Dez 2008, 20:14
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
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von bigben37
bigben37

Registriert seit: 19. Dez 2007
Ort: Freiburg
116 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Farbwerte je nach Zahlenwert

  Alt 28. Dez 2008, 20:20
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.
Benjamin
Optimismus ist nur ein Mangel an Information
  Mit Zitat antworten Zitat
Flips

Registriert seit: 17. Feb 2005
Ort: Sankt Wendel
491 Beiträge
 
Delphi 7 Professional
 
#4

Re: Farbwerte je nach Zahlenwert

  Alt 28. Dez 2008, 20:23
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

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.
Philipp F.
  Mit Zitat antworten Zitat
Benutzerbild von bigben37
bigben37

Registriert seit: 19. Dez 2007
Ort: Freiburg
116 Beiträge
 
Delphi 2009 Professional
 
#5

Re: Farbwerte je nach Zahlenwert

  Alt 28. Dez 2008, 20:29
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.
Benjamin
Optimismus ist nur ein Mangel an Information
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Farbwerte je nach Zahlenwert

  Alt 28. Dez 2008, 21:10
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
  Mit Zitat antworten Zitat
Flips

Registriert seit: 17. Feb 2005
Ort: Sankt Wendel
491 Beiträge
 
Delphi 7 Professional
 
#7

Re: Farbwerte je nach Zahlenwert

  Alt 29. Dez 2008, 14:14
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!
Philipp F.
  Mit Zitat antworten Zitat
Flips

Registriert seit: 17. Feb 2005
Ort: Sankt Wendel
491 Beiträge
 
Delphi 7 Professional
 
#8

Re: Farbwerte je nach Zahlenwert

  Alt 29. Dez 2008, 17:27
Ohje jetzt steh ich wieder aufem Schlauch, weiß gar ned was zur Zeit los ist...Liegt bestimmt daran das Ferien sind

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
Philipp F.
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Farbwerte je nach Zahlenwert

  Alt 29. Dez 2008, 17:48
Hallo Philipp,

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

g := Round(255 * (i - min) / (max - min)); Gruß Hawkeye
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:05 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