Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
Delphi 2007 Professional
|
Re: Verlauf mit "gewichteter" Farbe mittels Log?
4. Apr 2009, 11:25
Ich glaub' ich bin ganz nah dran, wenn ich die Aufgabe richtig verstanden hatte:
Delphi-Quellcode:
function GetColorBetween(FromColor, ToColor: TColor; FromDomPercent : Byte;
LoRange, HiRange, Position : Integer): TColor;
type
TRGB = packed record
R,G,B,P : Byte;
end;
const
Gewichtung = 200;
var
FromClr, ToClr, ResultClr : TRGB;
i : Integer;
begin
i := ColorToRGB(FromColor);
FromClr := TRGB(i);
i := ColorToRGB(ToColor);
ToClr := TRGB(i);
// Hier FromColor anteilig in ToColor einrechnen
if FromDomPercent in [1..100] then begin
ToClr.R := ToClr.R + ((FromDomPercent * FromClr.R) div 100);
ToClr.G := ToClr.G + ((FromDomPercent * FromClr.G) div 100);
ToClr.B := ToClr.B + ((FromDomPercent * FromClr.B) div 100);
end;
// Verlauf berechnen
i := (Position * 255) div (HiRange - LoRange);
ResultClr.R := ( (ToClr.R * i) + (FromClr.R * (255 - i)) ) div 255;
ResultClr.G := ( (ToClr.G * i) + (FromClr.G * (255 - i)) ) div 255;
ResultClr.B := ( (ToClr.B * i) + (FromClr.B * (255 - i)) ) div 255;
ResultClr.P := 0;
Result := TColor(ResultClr);
end;
procedure FillGradient(Canvas: TCanvas; FromClr, ToClr: TColor;
FromDomPercent: Byte; aRect: TRect; Vertical : Boolean);
var
i : Integer;
begin
if Vertical then begin
for i := aRect.Top to aRect.Bottom do begin
Canvas.Pen.Color := GetColorBetween(FromClr, ToClr, FromDomPercent, aRect.Top, aRect.Bottom, i);
Canvas.MoveTo(aRect.Left, i);
Canvas.LineTo(aRect.Right, i);
end;
end else begin
for i := aRect.Left to aRect.Right do begin
Canvas.Pen.Color := GetColorBetween(FromClr, ToClr, FromDomPercent, aRect.Left, aRect.Right, i);
Canvas.MoveTo(i, aRect.Top);
Canvas.LineTo(i, aRect.Bottom);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FillGradient(PaintBox1.Canvas, clRed, clBlue, SpinEdit1.Value, PaintBox1.ClientRect,False);
end;
PS: Nochmal leicht verändert, da Systemfarben nicht als Palettefarbe, sondern als Paletteneintrag behandelt werden...
PPS: Dominanz-Aufgabe noch mit eingebettet... 0-100% Domininaz der From-Farbe möglich (wobei 100% nicht die Zielfarbe völlig verschwinden lässt)
|
|
Zitat
|