La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

1 Scan conversione di poligoni Daniele Marini. 2 Test interno-esterno Scan conversione di un poligono = decidere se pixel interno Test di intersezione:

Presentazioni simili


Presentazione sul tema: "1 Scan conversione di poligoni Daniele Marini. 2 Test interno-esterno Scan conversione di un poligono = decidere se pixel interno Test di intersezione:"— Transcript della presentazione:

1 1 Scan conversione di poligoni Daniele Marini

2 2 Test interno-esterno Scan conversione di un poligono = decidere se pixel interno Test di intersezione: se p è interno ogni semiretta da p interseca il poligono un numero dispari di volte se p è esterno le intersezioni sono pari

3 3

4 4 OpenGL OGL garantisce la scan conversione di poligoni convessi creare modelli solo convessi triangolare (o tassellare) non troppo sottili o troppo lunghi più equilateri possibile (Delaunay)

5 5 GLUtesselator * una_tassellazione; una_tassellazione = gluNewTess(); gluTessBeginPolygon(una_tassellazione, NULL); gluTessBeginContour(una_tassellazione); for (i=0; i

6 6 gluTessBeginPolygon(tess, NULL); gluTessBeginContour(tess); gluTessVertex(tess, v1, v1); gluTessVertex(tess, v2, v2); gluTessVertex(tess, v3, v3); gluTessVertex(tess, v4, v4); gluTessEndContour(tess); gluNextContour(tess, GLU_INTERIOR); gluTessBeginContour(tess); gluTessVertex(tess, v5, v5); gluTessVertex(tess, v6, v6); gluTessVertex(tess, v7, v7); gluTessEndContour(tess); gluTessEndPolygon(tess); v1v2 v3v4 v5v6 v7

7 7 v1v2 v3v4 v5v6 v7 v1v2 v3v4 v5 v6 v7

8 8 Scan Conversione e z-buffer Vertici e normali non clippate, trasformate per proiezione prospettica, (z esiste ancora!), computo del colore ai vertici …. resta da fare: Proiezione ortografica, rimozione superfici nascoste, shading: integrato tutto in z-buffer! Si procede per linee di scansione per ogni poligono, incrementando y e x in coordinate NDC e incrementando z in funzione dellequazione del piano

9 9 A ogni incremento di x e y si procede con interpolazione bilineare (Gouraud o Phong) Durante questa fase si possono applicare texture.

10 10 Metodi alternativi Flood fill –Scan conversione dei bordi con Brasenham –Dato un punto iniziale (seme) esplorare ricorsivamente il vicinato per decidere se i pixel sono esterni o interni Scan line –Itera per y decrescenti (crescenti) decidi i poligoni attivi e il test interno-esterno

11 11 Flood fill flood-fill(int x, int y); { if(read_pixel(x,y)==WHITE) { write_pixel(x,y,BLACK); flood_fill(x-1,y); flood_fill(x+1,y); flood_fill(x,y-1); flood_fill(x,y+1); }

12 12 Scan Line La regola interno-esterno permette di determinare span, tutti i pixel di uno span assumono lo stesso colore (o vengono interpolati per shading) I poligoni si organizzano in una lista di poligoni attivi e i bordi di un poligono attivo vengono organizzati in lista di bordi attivi

13 13 Scan conversione di linee Convertire un segmento i cui estremi sono espressi come coppie di numeri reali, in una serie di PIXEL sullo schermo del computer. Problema di conversione da numero reale a intero e di campionamento su una griglia regolare di punti. Un metodo inadeguato dà luogo a alias molto evidenti; Aliasing è comunque sempre presente.

14 14 Requisiti Velocità luminosità uniforme stile linea antialiasing

15 15 Algoritmo base Calcola rapporto incrementale dy/dx genera punti sulla retta con lequazione esplicita: y i = mx i +b ad ogni passo arrotonda i valori allintero prossimo: Round(y i )=Floor(0.5+y i ) complessità alta: 1 moltiplicazione, 1 somma, 1 arrotondamento ad ogni passo

16 16 (x i,y i ) (x i+1, y i+m ) (x i, Round(y i )) (x i+1, Round(y i+m ))

17 17 Lalgoritmo opera su rette con |m|<=1, e incrementa ad ogni passo x di una unità (rette con pendenza compresa tra -45° e +45°) Per |m|>1 si applica lequazione x=f(y) e si incrementa (o decrementa) y di una unità

18 18

19 19 Metodo incrementale Si evita il prodotto y i+1 = mx i+1 + b = m(x i + dx) + b = y i + mdx Se dx=1 allora y i+1 = y i + m questo metodo è chiamato DDA, Digital Differential Analyzer

20 20 Algoritmo DDA procedure line(x0,y0,x1,y1:float; value:integer); var x:integer; dx,dy,y,m: float; begin dy:=y1-y0; dx:=x1-x0; m:=dy/dx; y:=y0; for x:=x0 to x1 do begin WritePixel(x,Round(y),value); y:=y+m end end.

21 21 Il metodo di Brasenham Niente prodotti: solo somme e confronti semplici si basa sulla valutazione dellerrore sfrutta la conoscenza passata cfr. Foley, Van Dam et al.

22 22 Si assume 0<= m <=1 (x p,y p ) E NE M Q Lalgoritmo valuta NE-Q e E-Q, il segno decide se attivare E o NE

23 23 Per il segno e sufficiente vedere da che lato è M rispetto al segmento valutare lequazione implicita della retta nel punto M: F(x,y): ax+by+c=0 dy=y1-y0, dx=x1-x0 quindi la F(x,y) è: dy.x + dx.y + dx = 0 occorre valutare la F(x,y) in (x p +1, y p +1/2) si adotta la variabile di decisione d: d = dy(x p +1)+ dx(y p +1/2) + dx

24 24 Se d>0 seleziona NE Se d<=0 seleziona E Al passo successivo p+1 la scelta dipende dalla precedente: caso E - al passo prec. si è scelto E si incrementa M di una unità, la variabile di decisione si modifica: d new = d old + dy

25 25 Caso NE - al passo prec. si è scelto NE, si incrementa M sia in y sia in x: d new = d old +dy-dx

26 26 Algoritmo di Brasenham (MidPointLine) Procedure MidPointLine(x0,y0,x1,y1:float;value:integer); var dx,dy,deltaE,deltaNE,d,x,y:integer; begin dx:=x1-x0; dy:=y1-y0; d:= 2*dy - dx; {d_start} deltaE:=2*dy; deltaNE:=2*(dy-dx); x:=x0; y:=y0; WritePixel(x0,y0,value); while x


Scaricare ppt "1 Scan conversione di poligoni Daniele Marini. 2 Test interno-esterno Scan conversione di un poligono = decidere se pixel interno Test di intersezione:"

Presentazioni simili


Annunci Google