Hallo zusammen,
ich versuche seit geraumer Zeit, einen Verlauf zwischen
zwei Farben so zu ändern, dass eine der beiden Farben
mehr Gewicht hat, also über eine gewisse Fläche hinweg
dominanter ist.
Ich habe mit Log() expermimentiert und habe festgestellt,
dass ich damit der Sache näherkomme. Leider geht der Verlauf
jedoch nicht von Anfang bis Ende, sondern wird kurz vor
Ende unterbrochen und fängt neu an.
Im Anhang ist ein Beispiel davon.
Ich verwende folgenden Code (Quelle leider unbekannt):
Delphi-Quellcode:
function GetColorBetween(StartColor, EndColor: TColor; Pointvalue,
aFrom, aTo : Extended): TColor;
var
F: Extended; r1, r2, r3, g1, g2, g3, b1, b2, b3: Byte;
function CalcColorBytes(fb1, fb2: Byte): Byte;
begin
result := fb1;
if fb1 < fb2
then Result := FB1 + Trunc(F * (fb2 - fb1));
if fb1 > fb2
then Result := FB1 - Trunc(F * (fb1 - fb2));
end;
begin
if Pointvalue <= aFrom
then
begin
result := StartColor;
exit;
end;
if Pointvalue >= aTo
then
begin
result := EndColor;
exit;
end;
F := ((Pointvalue - aFrom) / (aTo - aFrom));
{==== Hier kommt einer meiner Versuche ===}
F:= LogN(10, F);
{======================================}
asm
mov EAX, Startcolor
cmp EAX, EndColor
je @@exit
mov r1, AL
shr EAX,8
mov g1, AL
shr Eax,8
mov b1, AL
mov Eax, Endcolor
mov r2, AL
shr EAX,8
mov g2, AL
shr EAX,8
mov b2, AL
push ebp
mov al, r1
mov
dl, r2
call CalcColorBytes
pop ecx
push ebp
Mov r3, al
mov
dL, g2
mov al, g1
call CalcColorBytes
pop ecx
push ebp
mov g3, Al
mov
dL, B2
mov Al, B1
call CalcColorBytes
pop ecx
mov b3, al
XOR EAX,EAX
mov AL, B3
SHL EAX,8
mov AL, G3
SHL EAX,8
mov AL, R3
@@Exit:
mov @result, eax
end;
end;
procedure FillGradient(Canvas : TCanvas; aStart, aWidth, aHeight : Integer;
Color1, Color2 : TColor; Direction : TDirection);
var i : Integer;
begin
if (aWidth > 0)
and (aHeight > 0)
then
begin
case Direction
of
diHorizontal:
for i := aStart
to aWidth
do
begin
Canvas.Pen.Color := GetColorBetween(Color1, Color2, i, aStart, aWidth);
Canvas.MoveTo(i, 0);
Canvas.LineTo(i, aHeight);
end;
diVertical:
for i := aStart
to aHeight
do
begin
Canvas.Pen.Color := GetColorBetween(Color1, Color2, i, aStart, aHeight);
Canvas.MoveTo(0, i);
Canvas.LineTo(aWidth, i);
end;
end;
end;
end;
Leider bin ich ja mathematisch minderbegabt, d.h. ich sehe zwar
mit verschiedenen Log-Arten die Ergebnisse (z.B. viele, immer
kleiner werdende Verlaufsstrecken), kann mir aber nicht erklären,
wie ich einen soliden Wert ermittle, um einen durchgängigen
Verlauf von A nach B zu generieren
Wisst ihr hier eine Formel, mit der ich das lösen könnte?
Dank und Gruß
Jürgen
**** EDIT ****
Ich habe nun mit Prozentwerten gearbeitet und erhalte
eine sehr ähnliche Ausgabe, mit der ich ja schon *fast*
zufrieden wäre:
Delphi-Quellcode:
F := ((Pointvalue - aFrom) / (aTo - aFrom));
Percent:= (100 * Pointvalue) / (aTo - aFrom);
F:= (Percent * F) / 100;
Der Verlauf wird nun von der Startfarbe her gewichtet
-- das würde ich jetzt noch gerne umkehren. Leider bisher
noch ohne Erfolg.