|
Színátmenetes vonal rajzolása
|
|
Példaprogram letöltése
7662 bájt
|
Érdekes hatást kelthetünk olyan vonalak rajzolásával, amelyeknél nem csak a vonalak vastagságát, hanem a kiinduló és a befejező színt is külön-külön megadhatjuk. Természetesen a kiinduló és a befejező szín között színátmenetet produkálunk.
A feladat megoldásához létrehoztunk egy eljárást, aminek a deklarációja a következőképpen néz ki:
procedure GradientLine(c: TCanvas; startp, endp: TPoint;
color1, color2: TColor; width: byte);
A c az a canvas, amire a vonalat rajzolni kell (pl. Form1.Canvas). A startp a kiinduló és az endp a végpont koordinátái. A color1 a kiinduló, míg a Color2 a befejező szín, amik között a színátmenetet kell megrajzolni. A width paraméter a vonal vastagsága.
A kívánt eredmény eléréshez szükségünk van azokra a pontokra, amelyekből a vonal áll. Azt, hogy milyen pontokból áll egy vonal a LineDDA eljárással tudhatjuk meg. Erről már van szó egy korábbi cikkben, így ennek újbóli leírását most mellőzzük.
LineDDA(startp.x, startp.y, endp.x, endp.y, Addr(DDAProc), 0);
A pontok számának felhasználásával (cp) kiszámoljuk, hogy a kiinduló színből hány lépésben kell eljutnunk a befejező színig. Ezt színösszetevőnként kell megtennünk, hogy megfelelő eredményt kapjunk (rs, gs, bs). Az egyes színösszetevőket a GetRValue, GetGValue és GetBValue függvényekkel kérdezhetjük le. Ha kiszámoltuk a következő szín összetevőit, akkor azokból az RGB függvény segítségével állíthatjuk össze az új színt.
cr:=GetRValue(color1);
cg:=GetGValue(color1);
cb:=GetBValue(color1);
rs:=(GetRValue(color2) - cr) / cp;
gs:=(GetGValue(color2) - cg) / cp;
bs:=(GetBValue(color2) - cb) / cp;
Ha megvannak a kiinduló értékek, akkor egyesével végighaladunk a ponthalmazunkon.
i:=0;
while i<=cp do begin
Az aktuális színösszetevőkből előállítjuk a színt. Mivel az egyes színösszetevők itt a pontosabb számítás érdekében nem egész számok, ezért kerekítjük azokat a Round függvénnyel. A Round függvény a matematika szabályai szerint kerekít egész számra.
color:=RGB(Round(cr), Round(cg), Round(cb));
Beállítjuk a rajzoló színt, és kiszámoljuk a következő pont színének piros, zöld és kék színösszetevőjét.
c.brush.Color:=color;
c.pen.Color:=color;
cr:=cr+rs;
cg:=cg+gs;
cb:=cb+bs;
Ha a rajzolandó vonal vastagsága nagyobb mint 1, akkor az aktuális pontba egy kört rajzolunk a vonal vastagságának megfelelő átmérővel. Ezért kellett fent a brush.Color-t is beállítani az aktuális színre. Ha a vonal vastagsága 1, akkor egyszerűen csak beállítjuk a megfelelő pixel színét.
if width<2
then c.Pixels[points[i].x,points[i].y]:=color
else
begin
x0:=points[i].x - Width div 2;
y0:=points[i].y - Width div 2;
x1:=points[i].x + Width div 2;
y1:=points[i].y + Width div 2;
c.Ellipse(x0, y0, x1, y1);
end;
inc(i);
end;
end;
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2001 évkönyv 240. oldal
Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!
|