Die Sache mit dem
V := 100 div Steps;
ist unglücklich und führt zu ungenauen Ergebnissen.
Wieso nicht einfach eine Mischroutine schreiben, die einen Float-Wert als Mischungsverhältnis akzeptiert (also einfach die von Aphton leicht umschreiben).
Delphi-Quellcode:
function Blend(const Color1, Color2: TColor; const MixRatio: Double): TColor; // by Aphton
var
c1 : Array[0..3] of Byte Absolute Color1;
c2 : Array[0..3] of Byte Absolute Color2;
rs : Array[0..3] of Byte Absolute Result;
begin
rs[0] := Round(c1[0] + (c2[0] - c1[0]) * MixRatio);
rs[1] := Round(c1[1] + (c2[1] - c1[1]) * MixRatio);
rs[2] := Round(c1[2] + (c2[2] - c1[2]) * MixRatio);
rs[3] := 0;
end;
...
Delta := 1/Steps;
MixRatio := 0;
For i:=0 To Steps-1 do begin
ColorArray[i] := MixColors(Color1, color2, MixRatio);
MixRatio := MixRatio + Delta
End;
Wer komplett auf Floatingpointarithmetik verzichten will, kann es so probieren
Delphi-Quellcode:
function Blend(const Color1, Color2: TColor; const MixColor1, MixColor2 : Integer): TColor; // by Aphton
// Mische zwei Farben im Verhältnis MixColor1:MixColor2
var
c1 : Array[0..3] of Byte Absolute Color1;
c2 : Array[0..3] of Byte Absolute Color2;
rs : Array[0..3] of Byte Absolute Result;
MixColors : Integer;
begin
MixColors := MixColor1 + MixColor2;
rs[0] := Min(255, (c1[0]*MixColor1 + c2[0]*MixColor2) div MixColors);
rs[1] := Min(255, (c1[0]*MixColor1 + c2[0]*MixColor2) div MixColors);
rs[2] := Min(255, (c1[0]*MixColor1 + c2[0]*MixColor2) div MixColors);
rs[3] := 0;
end;
...
For i:=1 To Steps-1 do
ColorArray[i] := MixColors(Color1, color2, i, Steps - i - 1);
Die Integer-Variante könnte marginal andere Ergebnisse liefern (sofern sie denn funktioniert).