Está en la página 1de 61

Algoritmi de decupare

Decuparea capetelor

(Xmax , Ymax)

(Xmin , Ymin)

xmin < x < xmax si ymin < y < ymax

punct interior

Analiza capetelor unui segment de dreapta:

acceptare
rejectare
intersectie
Rezolvarea ecuatiilor folosind y = mx + b ecuatia dreptei
1

Algoritmi de decupare

Ecuatia parametrica a unei drepte

X = x0 + t(x1 x0)
Y = y0 + t(y1 y0)

0<t<1

P(t) = P0 + t(P1 P0)

Punct de intersectie cu segmentul de dreapta daca


tintersectie este in intervalul[0,1]

Algoritmul de decupare linii Cohen-Sutherland


Decuparea se realizeaza fata de o zona dreptunghiulara.

B
A

A
segment inclus

segment disjunct
B

I2

B
I1

I1

A
segment intersectat

segment intersectat

Algoritmul de decupare linii Cohen-Sutherland

Se considera punctele de max / min


xmin<=x<=xmax
ymin<=y<=ymax
ymax

ymin

xmin

xmax
4

Algoritmul de decupare linii Cohen-Sutherland


D1- ambele capete
in interior
acceptare triviala
D2- ambele capete
in exterior
rejectare

ymax
D4
D1

D3
ymin

D3,D4 trebuie sa
se calculeze
punctele de
intersectie

D2
xmin

xmax
5

Algoritmul de decupare linii Cohen-Sutherland

1001

Codificare b4b3b2b1
b4 = 1 y>ymax
b3 = 1 y<ymin
b2 = 1 x>xmax

0001

b1 = 1 x<xmin

0101

1000

1010
ymax

0000

0010
ymin

xmin

0100

0110
xmax
6

Algoritmul de decupare linii Cohen-Sutherland

1001

1000

D3
1010
ymax

0001
D4

0101
xmin

0000
D1
0100
D5

0010
D2
0110
xmax

ymin

Segmentul P1P2
Se codifica P1, P2
c1 = codificare(P1)
c2 = codificare(P2)

If c1 = c2 = 0
acceptare triviala
If c1 & c2 = true
rejectare triviala
7

Algoritmul de decupare linii Cohen-Sutherland

Algoritmul de decupare linii Cohen-Sutherland

1001

1000

1010
ymax

0001

P1 0000

0010
ymin

0101
xmin

0100

P2

0110

xmax
9

Algoritmul de decupare linii Cohen-Sutherland

1001

1000

1010
ymax

0001

P1 0000

0010

I1

0101
xmin

0100

ymin

0110
xmax
10

Algoritmul de decupare linii Cohen-Sutherland

1001

1000

1010
ymax

P1
0001

0000

0010
ymin

0101
xmin

0100

P2

0110

xmax
11

Algoritmul de decupare linii Cohen-Sutherland

1001

1000

1010
ymax

0001

I1

0000

0010
ymin

0101
xmin

0100

P2

0110

xmax
12

Algoritmul de decupare linii Cohen-Sutherland

1001

1000

1010
ymax

0001

I1

0101
xmin

0000
I2
0100

0010
ymin

0110
xmax
13

Algoritmul de decupare linii Cohen-Sutherland


codificare(x, y, xmin, xmax, ymin, ymax)
{
c = 0;
Codificare b4b3b2b1
if(x < xmin) c |= 1;
b1 = 1 x<xmin
if(x > xmax) c |= 2;
b2 = 1 x>xmax
if(y < ymin) c |= 4;
b3 = 1 y<ymin
if(y > ymax) c |= 8;
b4 = 1 y>ymax
intoarce c;
}
14

Algoritmul de decupare linii Cohen-Sutherland


decupare(x1, y1, x2, y2, xmin, ymin, xmax, ymax)
{
cod1 = codificare(x1, y1, xmin, ymin, xmax, ymax);
cod2 = codificare(x2, y2, xmin, ymin, xmax, ymax);
repeta
{
if(cod1 == 0 && cod2 == 0)
{(x1, y1) (x2, y2) segment inclus; stop;}
if(cod1 & cod2)
{(x1, y1) (x2, y2) segment disjunct; stop;}

15

Algoritmul de decupare linii Cohen-Sutherland


if(cod1 != 0) outc = cod1;
else outc = cod2;

if(outc & 1) //intersectie cu x = xmin


{calculeaza (x, y) punctul de intersectie cu x = xmin}
else
if(outc & 2) //intersectie cu x = xmax
{calculeaza (x, y) punctul de intersectie cu x = xmax}
else
if(outc & 4) //intersectie cu y = ymin
{calculeaza (x, y) punctul de intersectie cu y = ymin}
else
if(outc & 8) //intersectie cu y = ymax
{calculeaza (x, y) punctul de intersectie cu y = ymax}

16

Algoritmul de decupare linii Cohen-Sutherland


if(outc == cod1)
{
x1 = x; y1 = y;
cod1 = codificare(x1, y1, xmin, ymin, xmax, ymax);
}
else
{
x2 = x; y2 = y;
cod2 = codificare(x2, y2, xmin, ymin, xmax, ymax);
}
} //repeta
if(segment inclus)
(x1,y1) (x2,y2) segmentul inclus
}

17

Algoritmul de decupare linii Cohen-Sutherland

1001

1000

P2
1010
ymax

0001

0101
xmin

0000
P1

0010

0100

0110

ymin

xmax
18

Algoritmul de decupare linii Cohen-Sutherland

1001

1000

I1 1010
ymax

0001

0101
xmin

0000
P1

0010

0100

0110

ymin

xmax
19

Algoritmul de decupare linii Cohen-Sutherland

1001

0001

0101
xmin

1000

I2

1010
ymax

0000
P1

0010

0100

0110

ymin

xmax
20

Algoritmul de decupare linii Cohen-Sutherland


P1
1001

1000

1010
ymax

0001

0000

0010
ymin

0101
xmin

0100

0110

P2

xmax
21

Algoritmul de decupare linii Cohen-Sutherland

1001 I1 1000

1010
ymax

0001

0000

0010
ymin

0101
xmin

0100

0110

P2

xmax
22

Algoritmul de decupare linii Cohen-Sutherland

1001

0001

1000
I2

1010

0000

0010

ymax

ymin

0101
xmin

0100

0110

P2

xmax
23

Algoritmul de decupare linii Cohen-Sutherland

1001

0001

1000
I2

1010

0000

I3 0010

ymax

ymin

0101
xmin

0100

0110
xmax
24

Algoritmul de decupare linii Cohen-Sutherland

1001

1000

1010
ymax

0001

0000

0010

0101

0100
P1

0110

xmin

P2
ymin

xmax
25

Algoritmul de decupare linii Cohen-Sutherland

1001

1000

1010
ymax

0001

0000

0010
I1

0101
xmin

0100

P2
ymin

0110
xmax
26

Algoritmul de decupare linii Cyrus-Beck

27

Algoritmul de decupare linii Cyrus-Beck


Se determina t pentru intersectia P0 P1 cu
latura Ei:
Ni [P(t) PEi] = 0
Ni [P0 + (P1 P0)t PEi] = 0
Ni [P0 PEi] + Ni [P1 P0]t = 0
Se noteaza cu D vectorul de la P0 la P1
D = (P1 P0),
N [P P ]
i
0 Ei
t
N D
i

Ni 0
D 0 ( P1 P0)
Ni D 0 (Ei nu e paralela cu D)

28

Algoritmul de decupare linii Cyrus-Beck


B

Se elimina valorile lui t din afara intervalului [0,1]


29

Algoritmul de decupare linii Cyrus-Beck


B

I2
A

I1

D
I4
C

I3

P0 (t=0) P1 (t=1):
punct potential de intrare (Ni D < 0) PI
Punct potential de iesire (Ni D > 0) PE
30

Algoritmul de decupare linii Cyrus-Beck


B

PE
A

PI

D
PI
C

PE

If tPE < tPI nu exista intersectii


31

Algoritmul de decupare linii Cyrus-Beck


B
PE

PE
PI
A

PI

32

Algoritmul de decupare linii Cyrus-Beck


decupare(x1,y1,x2,y2,xmin,ymin,xmax,ymax)
{calculeaza Ni si alege PEi pentru fiecare latura;
if P1 = P2 decuparea unui punct;
else
{
t_PI = 0; t_PE = 1;
for fiecare punct de intersectie
if Ni D 0 latura paralela cu segmentul de decupat
{
calculeaza t;
se clasifica punctul in PI sau PE
(folosind semnul Ni D < 0 PI, > 0 PE);
if (PI) t_PI = max(t_PI,t);
if (PE) t_PE = min(t_PE,t);
}
}

33

Algoritmul de decupare linii Cyrus-Beck


if t_PI > t_PE
return nu exista intersectie
else
return P(t_PI) si P(t_PE) segmentul decupat
}
}

34

Algoritmul de decupare linii Cyrus-Beck

D = P1 P0 = (x1 x0, y1 y0)


PEi punct oarecare pe latura de decupare

35

Algoritmul Liang-Barsky

Pentru un punct de intersectie PI cu


tPI >tPE stop
Clasificarea punctelor de intersectie
punct potential de intrare (Ni D < 0) PI
punct potential de iesire (Ni D > 0) PE

36

Algoritmul Liang-Barsky>
Clasificarea punctelor de intersectie
punct potential de intrare (Ni D < 0) PI
Punct potential de iesire (Ni D > 0) PE

dx = x1-x0, dy = y1-y0
dx > 0 sau dy > 0 => PI
dx < 0 sau dy < 0 => PE
37

Algoritmul Liang-Barsky
bool Decupare_L(numitor, numarator, t_PI, t_PE)
{
//numitor = -(Ni.D): dx, -dx, dy, -dy
//numarator = Ni.(P1-PEi)
if(numitor > 0) //intersectie PI
{
calculeaza t = numarator/numitor;
if(t > t_PE) return FALSE;
if(t > t_PI) t_PI = t;
}

38

Algoritmul Liang-Barsky
if(numitor <0) //intersectie PE

{
calculeaza t = numarator/numitor;
if(t < t_PI) return FALSE;

if(t < t_PE) t_PE = t;


}
return TRUE;

39

Algoritmul Liang-Barsky
Decupare(x1,y1,x2,y2)
{
t_PI=0; t_PE = 1;
if (Decupare_L(dx, xmin-x1, t_PI, t_PE) == TRUE)//xmin
if (Decupare_L(-dx, x1-xmax, t_PI, t_PE) == TRUE)//xmax
if (Decupare_L(dy, ymin-xy, t_PI, t_PE) == TRUE)//ymin
if (Decupare_L(-dy, y1-ymax, t_PI, t_PE) == TRUE)//ymax
{
if(t_PE < 1)
{ x2 = x1 + t_PE*dx; y2 = y1 + t_PE * dy; }
if(t_PI > 0)
{ x1 = x1 + t_PI*dx; y1 = y1 + t_PI * dy; }
}
}
40

Decuparea poligoanelor

41

Algoritmul de decupare poligoane SutherlandHodgman

42

Algoritmul de decupare poligoane


Sutherland-Hodgman
s varful poligonului analizat la pasul anterior
p varful poligonului analizat la pasul curent
ext int

ext int

ext int

ext int

p
s

p
se pastreaza
nu se pastreaza
punctul de intersectie
nici un varf
I si varful p

s
se pastreaza
varful p

se pastreaza punctul
de intersectie I
43

Algoritmul de decupare poligoane


Sutherland-Hodgman

44

Algoritmul de decupare poligoane


Sutherland-Hodgman

45

Algoritmul de decupare poligoane


Sutherland-Hodgman
decuparePoligon(varfuri, nv, varfuri_dec, nv_dec, L)
{
nv_dec = 0;
s = varfuri[nv-1];
for(j = 0; j < nv, j++)
{
p = varfuri[j];
if(p este in semiplanul interior corespunzator laturii L)
if(s este in semiplanul interior corespunzator laturii L)
varfuri_dec[nv_dec++] = p;

46

Algoritmul de decupare poligoane


Sutherland-Hodgman

else //s exterior, p interior


{
i = punctul de intersectie dintre latura sp si latura L;
varfuri_dec[nv_dec++] = i;
varfuri_dec[nv_dec++] = p;
}

47

Algoritmul de decupare poligoane


Sutherland-Hodgman
else //p exterior
if(s este in semiplanul interior corespunzator laturii lat)
{
i = punctul de intersectie dintre latura sp si latura L;
varfuri_dec[nv_dec++] = i;
}
s = p;
} //for
}

48

Algoritmul de decupare poligoane


Sutherland-Hodgman
decupare(varfuri, nv, varfuri_dec, nv_dec, zona_decupare)
{
decuparePoligon(varfuri, nv, varfuri_dec, nv_dec, L1);
decuparePoligon(varfuri_dec, nv_dec, varfuri, nv, L2);
decuparePoligon(varfuri, nv, varfuri_dec, nv_dec, L3);
decuparePoligon(varfuri_dec, nv_dec, varfuri, nv, L4);
}

49

Algoritmul de decupare poligoane


Sutherland-Hodgman
decuparePoligon(varfuri, nv, varfuri_dec, nv_dec, L)
{
nv_dec = 0;
s = varfuri[nv-1];
for(j = 0; j < nv, j++)
{
p = varfuri[j];
if(p este in semiplanul interior corespunzator laturii L)
if(s este in semiplanul interior corespunzator laturii L)
varfuri_dec[nv_dec++] = p;
else //s exterior, p interior
{
i = punctul de intersectie dintre latura sp si latura L;
varfuri_dec[nv_dec++] = i;
varfuri_dec[nv_dec++] = p;
}
else //p exterior
if(s este in semiplanul interior corespunzator laturii lat)
{
i = punctul de intersectie dintre latura sp si latura L;
varfuri_dec[nv_dec++] = i;
}
s = p;
} //for
}

50

Algoritmul de decupare poligoane


Sutherland-Hodgman

51

Algoritmul de decupare poligoane


Sutherland-Hodgman

52

Algoritmul de decupare poligoane


Sutherland-Hodgman

53

Algoritmul Weiler-Atherton

Algoritmul Weiler-Atherton

In -> Out

Parcurge conturul pana cand


(a) Se determina un nou punct de intersectie
(b) Se intalneste un varf deja adaugat

Algoritmul Weiler-Atherton

Ext -> Int

Int -> Int

Algoritmul Weiler-Atherton

Continua de la ultimul varf de


intersectie de pe poligon

Out -> Int

Algoritmul Weiler-Atherton

Int -> Out

Algoritmul Weiler-Atherton

Decuparea in 3D

60

Decuparea in 3D Cohen Sutherland


bit 6
Far

bit 5
Near

bit 4
Top

bit 3
Bottom

bit 2
Right

bit 1
Left

61

También podría gustarte