11_algoritmi de decupare

61
1 Algoritmi de decupare Decuparea capetelor x min < x < x max si y min < y < y max punct interior Analiza capetelor unui segment de dreapta: acceptare rejectare intersectie Rezolvarea ecuatiilor folosind y = mx + b ecuatia dreptei (X min , Y min ) (X max , Y max )

Upload: andreea-sonea

Post on 11-Jul-2016

83 views

Category:

Documents


2 download

DESCRIPTION

Algoritmi de decupare. Bresenham

TRANSCRIPT

Page 1: 11_Algoritmi de Decupare

1

Algoritmi de decupare

• Decuparea capetelor

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

(Xmin , Ymin)

(Xmax , Ymax)

Page 2: 11_Algoritmi de Decupare

2

Algoritmi de decupare

• Ecuatia parametrica a unei drepte

X = x0 + t(x1 – x0) 0 < t < 1

Y = y0 + t(y1 – y0)

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

• Punct de intersectie cu segmentul de dreapta daca

tintersectie este in intervalul[0,1]

Page 3: 11_Algoritmi de Decupare

3

Algoritmul de decupare linii Cohen-Sutherland

Decuparea se realizeaza fata de o zona dreptunghiulara.

segment inclus

A

B

segment disjunct

A

B

segment intersectat

A

B

A

B

segment intersectat

I1

I1

I2

Page 4: 11_Algoritmi de Decupare

4

Algoritmul de decupare linii Cohen-Sutherland

• Se considera punctele de max / min

– xmin<=x<=xmax

– ymin<=y<=ymax

ymin

ymax

xmin xmax

Page 5: 11_Algoritmi de Decupare

5

Algoritmul de decupare linii Cohen-Sutherland

ymin

ymax

xmin xmax

• D1- ambele capete in interior acceptare triviala

• D2- ambele capete in exterior rejectare

• D3,D4 – trebuie sa se calculeze punctele de intersectie

D1

D2

D3D4

Page 6: 11_Algoritmi de Decupare

6

Algoritmul de decupare linii Cohen-Sutherland

• Codificare b4b3b2b1

– b4 = 1 y>ymax

– b3 = 1 y<ymin

– b2 = 1 x>xmax

– b1 = 1 x<xmin

ymin

ymax

xmin xmax

0000

1000

0100

0001 0010

1001

0101 0110

1010

Page 7: 11_Algoritmi de Decupare

7

Algoritmul de decupare linii Cohen-Sutherland

• Segmentul P1P2

• Se codifica P1, P2

• c1 = codificare(P1)

• c2 = codificare(P2)

ymin

ymax

xmin xmax

0000

1000

0100

0001 0010

1001

0101 0110

1010

D1 D2

D3

D5

If c1 = c2 = 0

acceptare triviala

If c1 & c2 = true

rejectare triviala

D4

Page 8: 11_Algoritmi de Decupare

8

Algoritmul de decupare linii Cohen-Sutherland

Page 9: 11_Algoritmi de Decupare

9

Algoritmul de decupare linii Cohen-Sutherland

ymin

ymax

xmin xmax

0000

1000

0100

0001 0010

1001

0101 0110

1010

P2

P1

Page 10: 11_Algoritmi de Decupare

10

Algoritmul de decupare linii Cohen-Sutherland

ymin

ymax

xmin xmax

0000

1000

0100

0001 0010

1001

0101 0110

1010

I1

P1

Page 11: 11_Algoritmi de Decupare

11

Algoritmul de decupare linii Cohen-Sutherland

ymin

ymax

xmin xmax

0000

1000

0100

0001 0010

1001

0101 0110

1010

P2

P1

Page 12: 11_Algoritmi de Decupare

12

Algoritmul de decupare linii Cohen-Sutherland

ymin

ymax

xmin xmax

0000

1000

0100

0001 0010

1001

0101 0110

1010

P2

I1

Page 13: 11_Algoritmi de Decupare

13

Algoritmul de decupare linii Cohen-Sutherland

ymin

ymax

xmin xmax

0000

1000

0100

0001 0010

1001

0101 0110

1010

I2

I1

Page 14: 11_Algoritmi de Decupare

14

Algoritmul de decupare linii Cohen-Sutherland

codificare(x, y, xmin, xmax, ymin, ymax)

{

c = 0;

if(x < xmin) c |= 1;

if(x > xmax) c |= 2;

if(y < ymin) c |= 4;

if(y > ymax) c |= 8;

intoarce c;

}

• Codificare b4b3b2b1

– b1 = 1 x<xmin

– b2 = 1 x>xmax

– b3 = 1 y<ymin

– b4 = 1 y>ymax

Page 15: 11_Algoritmi de Decupare

15

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;}

Page 16: 11_Algoritmi de Decupare

16

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}

Page 17: 11_Algoritmi de Decupare

17

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

}

Page 18: 11_Algoritmi de Decupare

18

Algoritmul de decupare linii Cohen-Sutherland

ymin

ymax

xmin xmax

0000

1000

0100

0001 0010

1001

0101 0110

1010

P2

P1

Page 19: 11_Algoritmi de Decupare

19

Algoritmul de decupare linii Cohen-Sutherland

ymin

ymax

xmin xmax

0000

1000

0100

0001 0010

1001

0101 0110

1010I1

P1

Page 20: 11_Algoritmi de Decupare

20

Algoritmul de decupare linii Cohen-Sutherland

ymin

ymax

xmin xmax

0000

1000

0100

0001 0010

1001

0101 0110

1010I2

P1

Page 21: 11_Algoritmi de Decupare

21

Algoritmul de decupare linii Cohen-Sutherland

ymin

ymax

xmin xmax

0000

1000

0100

0001 0010

1001

0101 0110

1010

P2

P1

Page 22: 11_Algoritmi de Decupare

22

Algoritmul de decupare linii Cohen-Sutherland

ymin

ymax

xmin xmax

0000

1000

0100

0001 0010

1001

0101 0110

1010

P2

I1

Page 23: 11_Algoritmi de Decupare

23

Algoritmul de decupare linii Cohen-Sutherland

ymin

ymax

xmin xmax

0000

1000

0100

0001 0010

1001

0101 0110

1010

P2

I2

Page 24: 11_Algoritmi de Decupare

24

Algoritmul de decupare linii Cohen-Sutherland

ymin

ymax

xmin xmax

0000

1000

0100

0001 0010

1001

0101 0110

1010

I3

I2

Page 25: 11_Algoritmi de Decupare

25

Algoritmul de decupare linii Cohen-Sutherland

ymin

ymax

xmin xmax

0000

1000

0100

0001 0010

1001

0101 0110

1010

P2

P1

Page 26: 11_Algoritmi de Decupare

26

Algoritmul de decupare linii Cohen-Sutherland

ymin

ymax

xmin xmax

0000

1000

0100

0001 0010

1001

0101 0110

1010

P2I1

Page 27: 11_Algoritmi de Decupare

27

Algoritmul de decupare linii Cyrus-Beck

Page 28: 11_Algoritmi de Decupare

28

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),

Ni 0

D 0 ( P1 P0)

Ni • D 0 (Ei nu e paralela cu D)

Di

N

iEPP

iN

t

]0

[

Page 29: 11_Algoritmi de Decupare

29

Algoritmul de decupare linii Cyrus-Beck

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

B

A D

C

Page 30: 11_Algoritmi de Decupare

30

• P0 (t=0) P1 (t=1):

– punct potential de intrare (Ni • D < 0) PI

– Punct potential de iesire (Ni • D > 0) PE

Algoritmul de decupare linii Cyrus-Beck

B

A D

C

I2

I1

I4

I3

Page 31: 11_Algoritmi de Decupare

31

Algoritmul de decupare linii Cyrus-Beck

B

A D

C

PE

PI

PI

PE

•If tPE < tPI nu exista intersectii

Page 32: 11_Algoritmi de Decupare

32

Algoritmul de decupare linii Cyrus-Beck

B

A

PE

PI

PI

PE

Page 33: 11_Algoritmi de Decupare

33

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);

}

}

Page 34: 11_Algoritmi de Decupare

34

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

}

}

Page 35: 11_Algoritmi de Decupare

35

Algoritmul de decupare linii Cyrus-Beck

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

• PEipunct oarecare pe latura de decupare

Page 36: 11_Algoritmi de Decupare

36

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

Page 37: 11_Algoritmi de Decupare

37

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

Page 38: 11_Algoritmi de Decupare

38

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;

}

Page 39: 11_Algoritmi de Decupare

39

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;

}

Page 40: 11_Algoritmi de Decupare

40

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; }

}

}

Page 41: 11_Algoritmi de Decupare

41

Decuparea poligoanelor

Page 42: 11_Algoritmi de Decupare

42

Algoritmul de decupare poligoane Sutherland-

Hodgman

Page 43: 11_Algoritmi de Decupare

43

Algoritmul de decupare poligoane

Sutherland-Hodgman

•s – varful poligonului analizat la pasul anterior

•p – varful poligonului analizat la pasul curent

ext int

s

p

nu se pastreaza

nici un varf

ext int

s p

se pastreaza

punctul de intersectie

I si varful p

ext int

s

p

se pastreaza

varful p

ext int

sp

se pastreaza punctul

de intersectie I

I

I

Page 44: 11_Algoritmi de Decupare

44

Algoritmul de decupare poligoane

Sutherland-Hodgman

Page 45: 11_Algoritmi de Decupare

45

Algoritmul de decupare poligoane

Sutherland-Hodgman

Page 46: 11_Algoritmi de Decupare

46

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;

Page 47: 11_Algoritmi de Decupare

47

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;

}

Page 48: 11_Algoritmi de Decupare

48

Algoritmul de decupare poligoane

Sutherland-Hodgman

else //p exteriorif(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}

Page 49: 11_Algoritmi de Decupare

49

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);

}

Page 50: 11_Algoritmi de Decupare

50

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}

Page 51: 11_Algoritmi de Decupare

51

Algoritmul de decupare poligoane

Sutherland-Hodgman

Page 52: 11_Algoritmi de Decupare

52

Algoritmul de decupare poligoane

Sutherland-Hodgman

Page 53: 11_Algoritmi de Decupare

53

Algoritmul de decupare poligoane

Sutherland-Hodgman

Page 54: 11_Algoritmi de Decupare

Algoritmul Weiler-Atherton

Page 55: 11_Algoritmi de Decupare

In -> Out Parcurge conturul pana cand

(a) Se determina un nou punct de intersectie

(b) Se intalneste un varf deja adaugat

Algoritmul Weiler-Atherton

Page 56: 11_Algoritmi de Decupare

Ext -> Int Int -> Int

Algoritmul Weiler-Atherton

Page 57: 11_Algoritmi de Decupare

Continua de la ultimul varf de

intersectie de pe poligonOut -> Int

Algoritmul Weiler-Atherton

Page 58: 11_Algoritmi de Decupare

Int -> Out

Algoritmul Weiler-Atherton

Page 59: 11_Algoritmi de Decupare

Algoritmul Weiler-Atherton

Page 60: 11_Algoritmi de Decupare

60

Decuparea in 3D

Page 61: 11_Algoritmi de Decupare

61

Decuparea in 3D – Cohen Sutherland

bit 6

Far

bit 5

Near

bit 4

Top

bit 3

Bottom

bit 2

Right

bit 1

Left