1 Programmazione grafica 1 Daniele Marini. 2 Dal modello alla sua raffigurazione Come passo dalla...

Post on 02-May-2015

216 views 0 download

Transcript of 1 Programmazione grafica 1 Daniele Marini. 2 Dal modello alla sua raffigurazione Come passo dalla...

1

Programmazione grafica1

Daniele Marini

2

Dal modello alla sua raffigurazione

• Come passo dalla descrizione astratta, geometrica di un modello alla sua raffigurazione?

• Le librerie grafiche permettono di descrivere e rappresentare tutti gli elementi del modello

• permettono anche di controllare il modo della raffigurazione (prospettiva, rendering, ..)

3

Librerie grafiche

• Librerie di funzioni che permettono di descrivere e raffigurare un modello geometrico (una forma), es:– OpenGL: libreria di procedure che realizza un API

(application programmer’s interface)– Standard de facto– Disponibile su windows, mac, IRIX, Solaris– Linux dispone di librerie free Mesa - subset di OpenGL– La struttura semantica è simile a quella di altre librerie: GKS,

Direct3D, Java3D

4

Funzioni essenziali

• Tutte le librerie devono prevedere funzioni essenziali per definire e manipolare elementi geometrici essenziali: punti, segmenti

• prevedono anche funzioni per definire e manipolare strutture più complesse: poligoni, poliedri, ecc.

5

Caratteristiche di una libreria grafica

• maschera le funzioni device dependent

• È strutturata in primitive, attributi, funzioni di visualizzazione, funzioni di trasformazione funzioni di input, funzioni di controllo

User programGraphics system

APII/O devices

Function call output

inputdata

6

Il livello più elementare:Disegnare al tratto - “Line drawing”

Il plotter a penna, le funzioni:

moveto (x,y)lineto (x,y)

Anche il controllo di un display può essere descritto in questostesso modo

le funzioni vengono interpretateda un driver

7

Disegno al tratto• Tracciare linee definite in uno spazio cartesiano

piano• Modalità molto diffusa ma con limiti: come

lavorare in 3D?• Come gestire strutture geometriche più evolute?

8

Disegno al tratto

• Possiamo pensare un disegno piano come la proiezione di un disegno tridimensionale

• Oppure come un disegno definito nello spazio 3d ma con punti su un medesimo piano di equazione z=0

9

Disegno al tratto

• I punti sono descritti da vettori:

p(x,y,z)o, nel piano, p(x,y,0)• Coppie o n-uple di vettori permettono di

definire segmenti, spezzate o poligoni

10

• I tipi principali sono:

punti

segmenti

spezzate

poligoni

p1p2

p3

p4p5

p1p2

p3

p4p5

p1p2

p3

p4p5

p1p2

p3

p4p5

11

Poligoni

Hanno diversi aspetti

Possono essere semplici e intrecciati

Convessi o non convessi

12

strisce di: triangoli, quadrangoli o ventagli di triangoli

p0 p2 p4 p6

p1 p3 p5 p7

p0 p2 p4 p6

p1 p3 p5 p7

aggregati di poligoni

13

Il processo base di raffigurazione di una geometria

• determinare quale parte della geometria raffigurare: trasformazione window_to_viewport

• decidere quali linee sono visibili e quali esterne alla window: clipping

• convertire la geometria in pixel: scan conversione di linee e poligoni

14

trasformazione window_to_viewport

15

Le coordinate schermo

La figura precedente è definita in uno spazio cartesiano indipendente dal dispositivo di visualizzazione (display, carta, …)

In passato il disegno veniva descritto direttamente in coordinate del dispositivo (es. il plotter)

La conversione tra coordinate ‘mondo’ - “world co-ordinates” e coordinate dispositivo - “device co-ordinates” si chiama trasformazione window-to-viewport

Spazio mondo /Spazio schermo

17

Coordinate mondoWC world co-ordinates

Coordinate schermoSC screen co-ordinates

window viewport

Window in WC: (xmin, ymin), (xmax,ymax)

Viewport in WC: (umin,vmin), (umax,vmax)

(xmin, ymin)

(xmax,ymax)

(umin,vmin)

(umax,vmax)

18

Traslazione: (-xmin,-ymin)

Scala: umax−umin

xmax−xmin

,vmax−vmin

ymax−ymin

⎝ ⎜ ⎜

⎠ ⎟ ⎟

Traslazione inversa : (umin,vmin)

19

clipping

20

Clipping di segmentiAlgoritmo di Cohen Sutherland

• Classificare punti rispetto alle rette che delimitano la finestra - codice a 4 bit: outcode

• esclusione o inclusione triviale con test sull’outcode

• per altri segmenti: cercare intersezione con equazione parametrica del segmento

21

Outcode: 4 casi• o1=o2=0 tutto interno• o1 ≠ 0 o2 = 0 un estremo interno uno esterno, il codice o1 indica quale bordo interseca• o1 & o2 ≠ 0 controllare se stanno dalla stessa parte se sì il segmento viene scartato• o1 & o2 = 0 entrambi gli estermi sono esterni ma in semipiani diversi, controllare

Il controllo richiede solo operazioni booleanePer calcolare l’intersezione con un bordo si usa l’equazione della retta y = mx + q

ATTENZIONE a segmenti paralleli ai bordi!

22

scan conversione di linee e poligoni

23

Dalla geometria ai pixel:scan conversione di linee

Convertire un segmento i cui estremi sono espressi comecoppie di numeri reali, in una serie di PIXEL sullo schermodel computer.

Problema di conversione da numero reale a intero e dicampionamento su una griglia regolare di punti.

Un metodo inadeguato dà luogo a “alias” molto evidenti;Aliasing è comunque sempre presente.

24

Requisiti

• Velocità

• luminosità uniforme

• stile linea

• antialiasing

25

Algoritmo base

• Calcola rapporto incrementale dy/dx

• genera punti sulla retta con l’equazione esplicita: yi = mxi +b

• ad ogni passo arrotonda i valori all’intero prossimo: Round(yi)=Floor(0.5+yi)

• complessità alta: 1 moltiplicazione, 1 somma, 1 arrotondamento ad ogni passo

26

(xi,yi)

(xi+1, yi+m)(xi, Round(yi))

(xi+1, Round(yi+m))

27

• L’algoritmo 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 l’equazione x=f(y) e si incrementa (o decrementa) y di una unità:

28

Metodo incrementale

• Si evita il prodotto

• yi+1 = mxi+1 + b = m(xi + dx) + b = yi + mdx

• Se dx=1 allora yi+1 = yi + m

• questo metodo è chiamato DDA, Digital Differential Analyzer

29

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

beginWritePixel(x,Round(y),value);y:=y+mend

end.