HyperLink


Bejelentkezés
E-mail: 
Jelszó: 






Skip Navigation Links
 

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!

Copyright © 1999-2010 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |