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