Einzelnen Beitrag anzeigen

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, 22: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