Sunteți pe pagina 1din 9

Transformri de vizualizare 2D

Grafica pe calculator Obiectele sunt descrise in coordonate logice (world


coordinates)

Ele sunt prezentate in fereastr

Decupare 2D Fereastra e afiat ntr-o poarta de afiare (viewport)

Victor Moraru

Afiarea scenelor Fereastra


Cnd afim scena se vor afia doar obiectele
O scen e compus din obiecte specificate n ce sunt in fereastr
coordonate logice
Fereastr
wymax

wymin

wxmin wxmax
3 4
Coordonate logice Coordonate logice
Fereastra Decuparea (clipping)
Celelalte vor fi decupate
Decupare la frontiera unui dreptunghi din spaiul de afiare,
avnd laturile paralele cu cele ale sistemului de coordonate
carteziene 2D (poarta de afiare)
Fereastra
wymax Decupare la frontiera unui poligon oarecare din spatiul de
afiare
Decuparea se poate efectua:

Analitic, prin intersecia primitivelor grafice cu frontiera
dreptunghiului/poligonului de decupare, nainte de rasterizare

wymin
La momentul rasterizarii primitivelor, prin testul de
apartenenta a fiecrui fragment la dreptunghiul/poligonul de
decupare
Pentru linii si poligoane, decuparea se efectueaz analitic (mai
wxmin wxmax eficient)
5 6
Coordonate logice

Decuparea (clipping) Decuparea punctelor


Pentru imaginea de mai jos care dintre linii i E simplu - un punct (x,y) nu este decupat dac:
puncte ar trebui pstrate i care ar trebui wxmin x wxmax SI wymin y wymax
decupate?
P4
in celelalte cazuri el e decupat
P4 Clipped
Window P2 Clipped
wymax
P6 Window P2
P3 wymax
P1 Clipped
P7 P5 P5
P1
P7 Points Within the Window
P9 are Not Clipped
P8
P9
wymin P8
wymin
P10
Clipped P10

7 8
wxmin wxmax wxmin wxmax
Decuparea liniilor Decuparea brut a liniilor
E mai complicat se vor examina capetele liniilor Procedura:
pentru a vedea dac sunt sau nu in fereastra Nu decupm liniile care au ambele capete in
interiorul ferestrei
Situaie Soluie Exemplu
Pentru liniile care au un
capt pe interior i altul pe
Ambele capete sunt in
Nu decupm exterior calculm punctul
fereastra
de intersecie (utilizm
ecuaia liniei) si decupm
Unul dintre capete e in
fereastra, celalalt e in
Trebuie sa din acest punct
decupam
afara ei

Ambele capete sunt in


Nu stim...
afara ferestrei 9 10

Algoritmul Cohen-Sutherland:
Decuparea brut a liniilor divizarea spaiului
Pentru liniile cu ambele
capete pe exterior s se Spaiul este divizat in regiuni in funcie de
verifice dac linia marginile ferestrei
intersecteaz marginile Fiecare regiune are un bit de identificare unic
ferestrei i s se decupeze
Codurile regiunilor indic poziia regiunilor in raport
corespunztor
cu fereastra

Calcularea intersectiilor consum multe resurse 1001 1000 1010


3 2 1 0
de procesor
0000
Din cauza ca scena poate contine foarte multe sus jos dreapta stanga 0001 0010
Fereastra
linii aceast metoda de decupare e prea lenta Codurile regiunilor

11 0101 0100 0110 12


Algoritmul Cohen-Sutherland: Algoritmul Cohen-Sutherland:
etichetarea linii in fereastr
Fiecare punct este etichetat cu un cod Liniile care au ambele capete in fereastr au
corespunztor codul [0000] pentru ambele capete si, respectiv,
nu se decupeaza
P11 [1010]
P4 [1000]
P11 [1010]
P4 [1000]
Window
wymax
P6 [0000] Window
P3 [0001] wymax
P6 [0000]
P5 [0000] P12 [0010] P3 [0001]
P7 [0001] P5 [0000] P12 [0010]
P9 [0000] P8 [0010] P7 [0001]
wymin P9 [0000] P8 [0010]
P10 [0100]
wymin
P13 [0101] P14 [0110]
P10 [0100]
P13 [0101] P14 [0110]
wxmin wxmax
13 14
wxmin wxmax

Algoritmul Cohen-Sutherland: Algoritmul Cohen-Sutherland:


linii pe exterior alte linii
Orice linie care are capetele cu coduri pe exterior Liniile care nu pot fi identificate nici ca fiind pe
si care apartin aceleeasi zone trebuie decupat interior sau pe exterior pot (sau nu pot) sa
Utilizm operatorul SI (AND) intersecteze fereastra
Ele vor fi prelucrate in felul urmtor:
P11 [1010]
P4 [1000]
Comparam captul pe exteriorul ferestrei cu
Window marginea ei (oricare dintre ele: stnga, dreapta, sus,
wymax
P6 [0000] jos) i determinam cat vom decupa
P3 [0001]
P5 [0000] P12 [0010]
Dac partea rmas a liniei e pe interior sau pe
P7 [0001] exterior, atunci, respectiv, nu vom decupa sau vom
wymin
P9 [0000] P8 [0010] decupa linia
P10 [0100]
P13 [0101] P14 [0110]

15 16
wxmin wxmax
Algoritmul Cohen-Sutherland: Algoritmul Cohen-Sutherland:
alte linii exemple
In caz contrar, comparm restul liniei in raport cu Fie linia P9 - P10 de mai jos
alte margini ale ferestrei
Pornim de la P10
Continum pn cnd linia e eliminata sau pn
cnd e gsit un segment pe interior Reieind din codurile Window
wy
celor doua capete max

Putem utiliza codurile de regiuni pentru a vedem ca linia nu


determina marginile ferestrei care ar putea fi intersecteaz nici
intersectate marginea dreapta, P [0000] 99
wy
Pentru a verifica dac linia intersecteaz o anumita nici pe cea stng
min
P [0000] 10

margine vom compara biii respectivi in codurile


capetelor Calculm intersecia liniei P [0100] 10

Dac unul e 1 i altul e 0 atunci linia intersecteaz cu marginea de jos i gsim wx min wx max

marginea punctul P10


Linia P9 - P10 e complet pe interior, deci o pstram
17 18

Algoritmul Cohen-Sutherland: Algoritmul Cohen-Sutherland:


exemple exemple
Considerm linia P3 - P4 Considerm linia P7 - P8
Pornim din P4 Pornim de la P7
P4 [1000]
P4 [1001]
Din codurile ambelor wymax
Window Din codurile ambelor Window
capete e clar ca linia capete e clar ca linia wy max

P3 [0001]
intersecteaz marginea intersecteaz marginea
P7 [0000]
dreapt, deci calculam stng, deci calculam P7 [0001] P8 [0010]
intersecia i gsim wymin
intersecia si gsim P8 [0000]
wy
punctul P4 punctul P7 min

Linia P3 - P4 este
complet pe exterior, wxmin wxmax wxmin wxmax
deci e decupat

19 20
Algoritmul Cohen-Sutherland:
exemple Calcularea interseciilor liniilor
Considerm linia P7 - P8
Punctele de intersecie cu marginile ferestrei
Pornim din P8
sunt calculate folosind parametrii ecuaiei liniei
Calculam intersecia Window Consideram o linie intre (x1, y1) si (x2, y2)
wymax
cu marginea dreapt
i gsim P8 Coordonata y a interseciei cu marginea vertical a
P7 [0000]
ferestrei poate fi calculat in felul urmtor:
P7 - P8 e pe interior, P7 [0001] P8 [0010]

deci nu o decupm wymin


P8 [0000] y = y1 + m (xlatura - x1)
unde xlatura poate fi wxmin sau wxmax

wxmin wxmax

21 22

Calcularea interseciilor liniilor Calcularea interseciilor liniilor


Coordonata x a interseciei cu marginea orizontala: Intersecia segmentului P1-P2 cu latura
x = x1 + (ylatura - y1) / m x = xmin a dreptunghiului:
1) xmin=x1+t(x2-x1)
unde ylatura poate fi sau wymin sau wymax
unde t=(xmin-x1)/(x2-x1)
m este nclinarea liniei: m = (y2 - y1) / (x2 - x1)
2) este 0<=t<=1 ???
da: punctul de intersectie se afla pe
segmentul P1-P2
- se calculeaza
yi=y1+(xmin-x1)*(y2-y1)/(x2-x1)
- este ymin<= yi <= ymax ??
da: exista intersectie intre vectorul
23 P1-P2 si latura x=xmin 24
Calcularea interseciilor liniilor Calcularea codului regiunilor
int xmin, ymin, xmax, ymax; // colturile dreptunghiului de decupare
// functia calculeaza codul binar al unui punct din plan
int codif(int x, int y)

Intersecia cu latura situata pe dreapta y = ymax {

ymax=y1+t(y2-y1) de unde, t=(ymax-y1)/(y2-y1) int cod;

x=x1+t(x2-x1) cod=(x < xmin) ? 1:0;

xi=x1+(ymax-y1)/m if(x > xmax) cod=2;

Intersecia cu latura situata pe dreapta x = xmin if(y < ymin) cod |=4;

xmin=x1+t(x2-x1), deci t=(xmin-x1)/(x2-x1) if(y > ymax) cod |=8;

y=y1+t(y2-y1) return cod;

yi=y1+(xmin-x1)*m }

25 26

Implementare Implementare
Int Cohen_Suth(int x1i,int y1i,int x2i,int y2i, int* x1d,int* y1d,int* x2d,int* y2d) if(cod1==0) //inversare capete
{t=x1;x1=x2;x2=t; t=y1;y1=y2;y2=t; cod1=cod2;}
{ // primeste coord. capetelor vectorului de decupat si intoarce coord. partii incluse in if(cod1 & 1)
dreptunghi, daca exista { y1+=(xmin-x1)*m; x1=xmin;}
int acceptat,rejectat,vertical; else
if(cod1 & 2)
float m, x1=x1i, y1=y1i, x2=x2i, y2=y2i; { y1+=(xmax-x1)*m; x1=xmax; }
int cod1, cod2, t; else
if(cod1 & 4)
acceptat=rejectat=vertical=0; { if (!vertical) x1+=(ymin-y1)/m;
if (x1i != x2i) y1=ymin;
m=(y2-y1)/(x2-x1); }
else
else {if (!vertical) x1+=(ymax-y1)/m;
vertical=1; y1=ymax;
}
do } while ( acceptat==rejectat);
{ cod1=codif(x1,y1); cod2=codif(x2,y2); if(acceptat)
if(cod1==0 && cod2==0) { acceptat=1; break;} {*x1d=x1;*y1d=y1;*x2d=x2;*y2d=y2;
return 1;
if((cod1 & cod2) !=0 ) { rejectat=1; break;} }
return 0;
}
}
27 28
Algoritmul Sutherland-Hodgman pentru
Decuparea suprafeelor decuparea suprafeelor
Suprafeele pot fi decupate
Poligonul e decupat lundu-se in consideraie
la fel ca i liniile
marginea la care se afla el
Va trebui s decidem care
poriune a suprafeei va
trebui decupat i care
pstrat

Aria original Decupare pe Decupare pe Decuparea Decuparea


stanga dreapata prii de sus prii de jos

29 30

Algoritmul Sutherland-Hodgman pentru Algoritmul Sutherland-Hodgman pentru


decuparea suprafeelor decuparea suprafeelor
Pentru a decupa suprafaa situat lng o anumita
margine: Avnd o sgeat intre P0,P1 Partea vizibil
vom avea 4 cazuri:
Considerm fiecare vrf i poziia sa in raport cu Intrarea in fereastra p p
marginile adugm P i P1
1
p
0
Plecarea din fereastra
Vrfurile din interior sunt pstrate de la decuparea in adugm doar P p p
1
raport cu marginea urmtoare Punctele sunt in afar p
0 p
Vrfurile din exterior sunt decupate
Nu facem nimic p
1

Punctele sunt in interior 0

Dac plecm dintr-un punct intern ctre unul extern, adugm doar P1
p
intersecia liniei cu marginea e memorat Unde P este punctul de 1 p
0

Dac intersectm din exterior spre interior punctul de intersecie


IN OUT
intersecie i vrful sunt memorate
31 32
Algoritmul Sutherland-Hodgman: exemple Alte suprafee decupate
Fiecare exemplu Decuparea suprafeelor concave e mai
S
arat punctul complicata deoarece va trebui sa nlturam liniile
procesat (P) i S de prisos
P
punctul precedent (S) I

Punctele salvate P
Salveaz punctul P Salveaz punctul I
definesc suprafaa
decupat la marginea P S
respectiva I P
Ferastr Ferastr Ferastr Ferastr

S Decuparea curbelor cere mai mult efort


Nu salvm puncte Salvm I i P 33 Pentru cercuri trebuie sa gsim doua puncte de 34
intersectare cu marginea ferestrei

Rezumat
Obiectele scenei necesit decupare pentru a
pstra doar ceea ce trebuie afiat
Pe motivul c pot exista destul de multe obiecte,
decuparea trebuie sa fie eficient
Algoritmul Cohen-Sutherland poate fi utilizat att
pentru decuparea liniilor ct i a suprafeelor

35

S-ar putea să vă placă și