30.12.2012 Views

Amiga Magazine Online

Amiga Magazine Online

Amiga Magazine Online

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

permettono di suddividere poligoni sia concavi che con-<br />

vessi, con un qualunque numero di lati e anche con bu-<br />

chi al loro interno. La maggior parte di tali algoritmi im-<br />

plementa il seguente schema di massima (si osservi la fi-<br />

gura 3):<br />

Fig. 3 - Un poligono concavo a cui è applicata<br />

una scan line.<br />

a mtersez1onekm<br />

e illato AG del<br />

C interselibne tra sran<br />

e il lato BC del polip<br />

d . intersezme tnt scafi<br />

2 ti Into DE del piig<br />

1: Per ogni scan line (ogni riga dello schermo per la qua<br />

le andiamo a cercare intersezioni con uno o più lati<br />

del poligono);<br />

2: Cercare l'intersezione della scan line con ogni lato del<br />

poligono;<br />

3: Ordinare le intersezioni trovate secondo la coordinata<br />

x crescente;<br />

4: Tracciare tutti i pixel interni al poligono, compresi tra<br />

le coppie di intersezioni, cioè tra la prima e la secon<br />

da intersezione, tra la terza e la quarta e così via.<br />

I1 numero di intersezioni sarà necessariamente pari e per<br />

ogni coppia di intersezioni bisognerà tracciare un trattino<br />

di pixel.<br />

Tale algoritmo può essere notevolmente ottimizzato te-<br />

nendo conto del fatto che solo una parte dei lati interse-<br />

ca una data scan line e che ogni lato intersecato dalla<br />

scan line i, è molto spesso intersecato anche dalla scan<br />

iine i+l.<br />

L'algoritmo appena descritto è però scarsamente utilizza-<br />

bile in applicazioni real-tirne, in quanto computazional-<br />

mente troppo esoso. Bisogna poi dire che raramente si<br />

ha bisogno di tracciare poligoni di grande complessità e<br />

che, in ogni caso, qualunque poligono complesso può<br />

essere scomposto in un insieme di poligoni più semplici<br />

(triangoli o rettangoli).<br />

Andiamo allora a esaminare un algoritmo di tipo più<br />

semplice e di efficienza superiore, che permette di trac-<br />

ciare solo poligoni<br />

convessi con un<br />

qualunque numero<br />

di lati, ma senza bu-<br />

chi al loro interno.<br />

Con queste limita-<br />

zioni siamo sicuri<br />

che ogni scan line<br />

potrà contenere al<br />

massimo un trattino<br />

di pixel.<br />

Per implementare<br />

l'algoritmo sono ne-<br />

cessari due array di<br />

interi, di dimensione<br />

pari al numero di ri-<br />

ghe a schermo e che<br />

chiameremo: MinXlI<br />

e MaxXi% Ogni ele-<br />

mento degli array<br />

corrisponde a una ri-<br />

ga dello schermo e<br />

andrà a contenere<br />

una delle due coor-<br />

dinate x del trattino<br />

di pixel da tracciare<br />

in quella riga. Più<br />

precisamente, l'array<br />

MinW conterrà le<br />

coordinate .Y minori,<br />

mentre l'array<br />

MaxM conterrà le x<br />

maggiori.<br />

L'algoritmo consiste<br />

nei tracciare tutti i<br />

lati del poligono uti-<br />

lizzando una parti-<br />

colare routine di<br />

plot dei pixel, che<br />

scrive nei due array<br />

MinXl7 e MaxXD in-<br />

vece che nella memoria video:<br />

procedure DrawLine(xl,yl,xZ,y2;<br />

int x,y,ax,ay,sx,sy,d,count<br />

x = xl<br />

Y = YI<br />

ax = abs(x2 - xl)<br />

ay = abs(y2 - yl)<br />

if (x2 - x1)>0<br />

else<br />

sx = -l<br />

endif<br />

if (y2 - y1)>0<br />

sy = l<br />

else<br />

sy = -l<br />

endif<br />

if ax > ay<br />

d = a x / 2<br />

for count = O to ax<br />

Plot(xry)<br />

d -= ay<br />

i f d < O<br />

d += ax<br />

y += sy<br />

endif<br />

X += SX<br />

endf or<br />

else<br />

d = a y / 2<br />

£or count = O to ay<br />

Plot(xry)<br />

d -= ax<br />

ifd MaxX[y]) then MaxX[y] = x<br />

endprocedure<br />

Come si può facilmente capire, dopo aver tracciato tutti i<br />

lati del poligono, i due array conterranno le coordinate x<br />

iniziale e finale di ogni trattino di pixel da tracciare a<br />

schermo. Quello che rimane da fare è scorrere i due ar-<br />

ray a partire dagli elementi corrispondenti alla y minore,<br />

fino agli elementi corrispondenti alla y maggiore e trac-<br />

(segue a pagina 50)

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!