Sunteți pe pagina 1din 45

Clipping

Marian Ioan MUNTEANU

Al.I.Cuza University of Iasi, Romania


webpage: http://www.math.uaic.ro/∼munteanu

22 noiembrie 2011

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 1 / 19


Cuprins

Cuprins

1 Clipping pentru segmente de dreaptă

2 Teste de acceptare / respingere

3 Algoritmul Cohen - Sutherland

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 2 / 19


Cuprins

Ce ı̂nseamnă clipping?

Până acum am ignorat orice legătură ı̂ntre rasterizare şi dimensiunile


monitorului sau ferestrei destinate aplicaţiei grafice.
Clipping este una dintre cele mai importante probleme ı̂n Computer
Graphics şi ideea de bază este scrierea primitivelor grafice folosind
coordonatele zonei de lucru.
A face clipping ı̂nseamnă a indentifica porţiunile primitivei care sunt
vizibile şi care nu. În consecinţă, clipping ı̂nseamnă a ilumina doar
pixelii care se află ı̂n interiorul suprafeţei de desenat, care, ı̂n mod
frecvent, este un dreptunghi cu axele paralele cu axele de coordonate.

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 3 / 19


Cuprins

Ce ı̂nseamnă clipping?

Până acum am ignorat orice legătură ı̂ntre rasterizare şi dimensiunile


monitorului sau ferestrei destinate aplicaţiei grafice.
Clipping este una dintre cele mai importante probleme ı̂n Computer
Graphics şi ideea de bază este scrierea primitivelor grafice folosind
coordonatele zonei de lucru.
A face clipping ı̂nseamnă a indentifica porţiunile primitivei care sunt
vizibile şi care nu. În consecinţă, clipping ı̂nseamnă a ilumina doar
pixelii care se află ı̂n interiorul suprafeţei de desenat, care, ı̂n mod
frecvent, este un dreptunghi cu axele paralele cu axele de coordonate.

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 3 / 19


Cuprins

Ce ı̂nseamnă clipping?

Până acum am ignorat orice legătură ı̂ntre rasterizare şi dimensiunile


monitorului sau ferestrei destinate aplicaţiei grafice.
Clipping este una dintre cele mai importante probleme ı̂n Computer
Graphics şi ideea de bază este scrierea primitivelor grafice folosind
coordonatele zonei de lucru.
A face clipping ı̂nseamnă a indentifica porţiunile primitivei care sunt
vizibile şi care nu. În consecinţă, clipping ı̂nseamnă a ilumina doar
pixelii care se află ı̂n interiorul suprafeţei de desenat, care, ı̂n mod
frecvent, este un dreptunghi cu axele paralele cu axele de coordonate.

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 3 / 19


Cuprins

Ce ı̂nseamnă clipping?

Poate fi realizată analitic ı̂nainte sau ı̂n timpul conversiei de scanare.


Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 4 / 19
Cuprins

Ce ı̂nseamnă clipping?

Poate fi realizată analitic ı̂nainte sau ı̂n timpul conversiei de scanare.


Deoarece ”decuparea” analitică a liniilor şi poligoanelor este uşor de
realizat, aceasta este realizată de obicei ı̂naintea conversiei de scanare, ı̂n
timp ce alte primitive sunt decupate ı̂n timpul conversiei.

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 4 / 19


Cuprins

Ce ı̂nseamnă clipping?

Poate fi realizată analitic ı̂nainte sau ı̂n timpul conversiei de scanare.


Deoarece ”decuparea” analitică a liniilor şi poligoanelor este uşor de
realizat, aceasta este realizată de obicei ı̂naintea conversiei de scanare, ı̂n
timp ce alte primitive sunt decupate ı̂n timpul conversiei.

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 4 / 19


Clipping pentru segmente de dreaptă

Clipping pentru punct

Presupunem că fereastra dreptunghiulară are vârful din stânga-jos de


coordonate (xmin , ymin ) iar pe cel din dreapta-sus de coordonate
(xmax , ymax ).
Pentru ca un punct P(x, y ) să fie vizibil ı̂n fereastră trebuie
satisfăcute relaţiile:

xmin ≤ x ≤ xmax , ymin ≤ y ≤ ymax .

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 5 / 19


Clipping pentru segmente de dreaptă

Clipping pentru segmente de dreaptă

Un segment de dreaptă faţă de o fereastră:

a) complet ı̂n interior: (AB)


b) complet ı̂n exterior: (EF ) şi (IJ)
c) un capăt ı̂n interior, celălalt ı̂n exterior: (CD)
d) ambele capete ı̂n exterior, dar o parte a segmentului ı̂n interior: (GH)

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 6 / 19


Clipping pentru segmente de dreaptă

Clipping pentru segmente de dreaptă

Un segment de dreaptă faţă de o fereastră:

a) complet ı̂n interior: (AB)


b) complet ı̂n exterior: (EF ) şi (IJ)
c) un capăt ı̂n interior, celălalt ı̂n exterior: (CD)
d) ambele capete ı̂n exterior, dar o parte a segmentului ı̂n interior: (GH)

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 6 / 19


Clipping pentru segmente de dreaptă

Clipping pentru segmente de dreaptă

Un segment de dreaptă faţă de o fereastră:

a) complet ı̂n interior: (AB)


b) complet ı̂n exterior: (EF ) şi (IJ)
c) un capăt ı̂n interior, celălalt ı̂n exterior: (CD)
d) ambele capete ı̂n exterior, dar o parte a segmentului ı̂n interior: (GH)

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 6 / 19


Clipping pentru segmente de dreaptă

Clipping pentru segmente de dreaptă

Un segment de dreaptă faţă de o fereastră:

a) complet ı̂n interior: (AB)


b) complet ı̂n exterior: (EF ) şi (IJ)
c) un capăt ı̂n interior, celălalt ı̂n exterior: (CD)
d) ambele capete ı̂n exterior, dar o parte a segmentului ı̂n interior: (GH)

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 6 / 19


Clipping pentru segmente de dreaptă

Clipping pentru segmente de dreaptă

Un segment de dreaptă faţă de o fereastră:

a) complet ı̂n interior: (AB)


b) complet ı̂n exterior: (EF ) şi (IJ)
c) un capăt ı̂n interior, celălalt ı̂n exterior: (CD)
d) ambele capete ı̂n exterior, dar o parte a segmentului ı̂n interior: (GH)

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 6 / 19


Clipping pentru segmente de dreaptă

Clipping pentru segmente de dreaptă

Un algoritm simplu este următorul:

• dacă ambele capete ale segmentului sunt ı̂n interior, se trasează


segmentul;
• dacă numai un capăt este ı̂n interior (şi celălalt ı̂n exterior) se
determină punctul de intersecţie cu marginea ferestrei şi se trasează
subsegmentul de interior;
• altfel, se calculează intersecţiile cu liniile ce definesc marginea
ferestrei şi, dacă punctele de intersecţie sunt pe segmentele de dreaptă ce
definesc frontiera ferestrei, se trasează subsegmentul dintre acestea.

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 7 / 19


Clipping pentru segmente de dreaptă

Clipping pentru segmente de dreaptă

Un algoritm simplu este următorul:

• dacă ambele capete ale segmentului sunt ı̂n interior, se trasează


segmentul;
• dacă numai un capăt este ı̂n interior (şi celălalt ı̂n exterior) se
determină punctul de intersecţie cu marginea ferestrei şi se trasează
subsegmentul de interior;
• altfel, se calculează intersecţiile cu liniile ce definesc marginea
ferestrei şi, dacă punctele de intersecţie sunt pe segmentele de dreaptă ce
definesc frontiera ferestrei, se trasează subsegmentul dintre acestea.

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 7 / 19


Clipping pentru segmente de dreaptă

Clipping pentru segmente de dreaptă

Un algoritm simplu este următorul:

• dacă ambele capete ale segmentului sunt ı̂n interior, se trasează


segmentul;
• dacă numai un capăt este ı̂n interior (şi celălalt ı̂n exterior) se
determină punctul de intersecţie cu marginea ferestrei şi se trasează
subsegmentul de interior;
• altfel, se calculează intersecţiile cu liniile ce definesc marginea
ferestrei şi, dacă punctele de intersecţie sunt pe segmentele de dreaptă ce
definesc frontiera ferestrei, se trasează subsegmentul dintre acestea.

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 7 / 19


Clipping pentru segmente de dreaptă

Clipping pentru segmente de dreaptă

Un algoritm simplu este următorul:

• dacă ambele capete ale segmentului sunt ı̂n interior, se trasează


segmentul;
• dacă numai un capăt este ı̂n interior (şi celălalt ı̂n exterior) se
determină punctul de intersecţie cu marginea ferestrei şi se trasează
subsegmentul de interior;
• altfel, se calculează intersecţiile cu liniile ce definesc marginea
ferestrei şi, dacă punctele de intersecţie sunt pe segmentele de dreaptă ce
definesc frontiera ferestrei, se trasează subsegmentul dintre acestea.

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 7 / 19


Teste de acceptare / respingere

Ce ı̂nseamnă?

Algoritmul de mai ı̂nainte poate fi perfecţionat prin efectuarea unor teste


simple asupra capetelor segmentului.

Testul care verifică dacă ambele capete ale segmentului sunt
interioare fereastrei poartă numele de test de acceptare.

Orice segment care are ambele capete de aceeaşi parte a ferestrei
(sus, jos, stânga, dreapta) este complet invizibil. Testul care verifică
această condiţie se numeşte test de respingere.
Prin adăugarea testelor de acceptare şi respingere se obţine un algoritm a
cărui eficienţă se manifestă cu precădere ı̂n două situaţii:
(a) majoritatea segmentelor de reprezentat se află ı̂n interiorul ferestrei;
(b) majoritatea segmentelor de reprezentat se află ı̂n afara ferestrei.

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 8 / 19


Teste de acceptare / respingere

Ce ı̂nseamnă?

Algoritmul de mai ı̂nainte poate fi perfecţionat prin efectuarea unor teste


simple asupra capetelor segmentului.

Testul care verifică dacă ambele capete ale segmentului sunt
interioare fereastrei poartă numele de test de acceptare.

Orice segment care are ambele capete de aceeaşi parte a ferestrei
(sus, jos, stânga, dreapta) este complet invizibil. Testul care verifică
această condiţie se numeşte test de respingere.
Prin adăugarea testelor de acceptare şi respingere se obţine un algoritm a
cărui eficienţă se manifestă cu precădere ı̂n două situaţii:
(a) majoritatea segmentelor de reprezentat se află ı̂n interiorul ferestrei;
(b) majoritatea segmentelor de reprezentat se află ı̂n afara ferestrei.

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 8 / 19


Teste de acceptare / respingere

Ce ı̂nseamnă?

Algoritmul de mai ı̂nainte poate fi perfecţionat prin efectuarea unor teste


simple asupra capetelor segmentului.

Testul care verifică dacă ambele capete ale segmentului sunt
interioare fereastrei poartă numele de test de acceptare.

Orice segment care are ambele capete de aceeaşi parte a ferestrei
(sus, jos, stânga, dreapta) este complet invizibil. Testul care verifică
această condiţie se numeşte test de respingere.
Prin adăugarea testelor de acceptare şi respingere se obţine un algoritm a
cărui eficienţă se manifestă cu precădere ı̂n două situaţii:
(a) majoritatea segmentelor de reprezentat se află ı̂n interiorul ferestrei;
(b) majoritatea segmentelor de reprezentat se află ı̂n afara ferestrei.

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 8 / 19


Teste de acceptare / respingere

Ce ı̂nseamnă?

Algoritmul de mai ı̂nainte poate fi perfecţionat prin efectuarea unor teste


simple asupra capetelor segmentului.

Testul care verifică dacă ambele capete ale segmentului sunt
interioare fereastrei poartă numele de test de acceptare.

Orice segment care are ambele capete de aceeaşi parte a ferestrei
(sus, jos, stânga, dreapta) este complet invizibil. Testul care verifică
această condiţie se numeşte test de respingere.
Prin adăugarea testelor de acceptare şi respingere se obţine un algoritm a
cărui eficienţă se manifestă cu precădere ı̂n două situaţii:
(a) majoritatea segmentelor de reprezentat se află ı̂n interiorul ferestrei;
(b) majoritatea segmentelor de reprezentat se află ı̂n afara ferestrei.

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 8 / 19


Teste de acceptare / respingere

Ce ı̂nseamnă?

Algoritmul de mai ı̂nainte poate fi perfecţionat prin efectuarea unor teste


simple asupra capetelor segmentului.

Testul care verifică dacă ambele capete ale segmentului sunt
interioare fereastrei poartă numele de test de acceptare.

Orice segment care are ambele capete de aceeaşi parte a ferestrei
(sus, jos, stânga, dreapta) este complet invizibil. Testul care verifică
această condiţie se numeşte test de respingere.
Prin adăugarea testelor de acceptare şi respingere se obţine un algoritm a
cărui eficienţă se manifestă cu precădere ı̂n două situaţii:
(a) majoritatea segmentelor de reprezentat se află ı̂n interiorul ferestrei;
(b) majoritatea segmentelor de reprezentat se află ı̂n afara ferestrei.

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 8 / 19


Algoritmul Cohen - Sutherland

Dacă o linie nu este nici respinsă şi nici acceptată atunci se


calculează, ı̂ntr-o ordine prestabilită, intersecţiile liniei cu dreptele
suport ale laturilor ferestrei de lucru: y = ymax , x = xmax , y = ymin ,
x = xmin , ı̂ndepărtând porţiunile de segment care se situează ı̂n afara
ferestrei dreptunghiulare. Rezultă astfel un nou segment, iar
procedura se buclează asupra ei ı̂nsăşi până când un segment rezultat
este acceptat sau respins.
Algoritmul care urmează propune ca
ecranul să se dividă ı̂n 9 regiuni de- 1001 1000 1010
terminate de marginile ferestrei. În 0001 0000 0010
prezentarea clasică a algoritmului Co- 0101 0100 0110
hen - Sutherland se asociază fiecărui
capăt al unui segment un cod de 4 cifre
şi anume:

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 9 / 19


Algoritmul Cohen - Sutherland

Dacă o linie nu este nici respinsă şi nici acceptată atunci se


calculează, ı̂ntr-o ordine prestabilită, intersecţiile liniei cu dreptele
suport ale laturilor ferestrei de lucru: y = ymax , x = xmax , y = ymin ,
x = xmin , ı̂ndepărtând porţiunile de segment care se situează ı̂n afara
ferestrei dreptunghiulare. Rezultă astfel un nou segment, iar
procedura se buclează asupra ei ı̂nsăşi până când un segment rezultat
este acceptat sau respins.
Algoritmul care urmează propune ca
ecranul să se dividă ı̂n 9 regiuni de- 1001 1000 1010
terminate de marginile ferestrei. În 0001 0000 0010
prezentarea clasică a algoritmului Co- 0101 0100 0110
hen - Sutherland se asociază fiecărui
capăt al unui segment un cod de 4 cifre
şi anume:

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 9 / 19


Algoritmul Cohen - Sutherland

1001 1000 1010


0001 0000 0010
0101 0100 0110
→ 1 dacǎ punctul este deasupra ferestrei
a) prima cifră este
→ 0 ı̂n rest
→ 1 dacǎ punctul este sub fereastrǎ
b) a doua cifră este
→ 0 ı̂n rest
→ 1 dacǎ punctul este ı̂n dreapta ferestrei
c) a treia cifră este
→ 0 ı̂n rest
→ 1 dacǎ punctul este ı̂n stânga ferestrei
d) a patra cifră este
→ 0 ı̂n rest .

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 10 / 19


Algoritmul Cohen - Sutherland

Puterea algoritmului constă ı̂n faptul că, odată determinate codurile


asociate capetelor segmentului, testele de acceptare sau respingere se
realizează prin operaţii logice rapide.
Dacă ambele capete ale segmentului au codul 0000 atunci, ı̂n mod
banal, se poate decide că segmentul se află ı̂n ı̂ntregime ı̂n interiorul
ferestrei. Acesta este cazul segmentului (AB) din figură.
De asemenea, ı̂n mod banal se poate decide că un segment este ı̂n
ı̂ntregime ı̂n exterior când operaţia AND logic ı̂ntre codurile celor
două puncte conduce la un rezultat diferit de 0. Într-adevăr, ı̂n acest
caz, ambele puncte se află ı̂ntr-un acelaşi semiplan (cel indentificat de
bitul 1 al rezultatului) şi astfel segmentul nu intersectează
dreptunghiul de clipping. Este cazul segmentului (EF ) din figură.
Avem: E (0001) şi F (1001) şi astfel

0001 ∧ 1001 = 0001 6= 0000.

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 11 / 19


Algoritmul Cohen - Sutherland

Puterea algoritmului constă ı̂n faptul că, odată determinate codurile


asociate capetelor segmentului, testele de acceptare sau respingere se
realizează prin operaţii logice rapide.
Dacă ambele capete ale segmentului au codul 0000 atunci, ı̂n mod
banal, se poate decide că segmentul se află ı̂n ı̂ntregime ı̂n interiorul
ferestrei. Acesta este cazul segmentului (AB) din figură.
De asemenea, ı̂n mod banal se poate decide că un segment este ı̂n
ı̂ntregime ı̂n exterior când operaţia AND logic ı̂ntre codurile celor
două puncte conduce la un rezultat diferit de 0. Într-adevăr, ı̂n acest
caz, ambele puncte se află ı̂ntr-un acelaşi semiplan (cel indentificat de
bitul 1 al rezultatului) şi astfel segmentul nu intersectează
dreptunghiul de clipping. Este cazul segmentului (EF ) din figură.
Avem: E (0001) şi F (1001) şi astfel

0001 ∧ 1001 = 0001 6= 0000.

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 11 / 19


Algoritmul Cohen - Sutherland

Puterea algoritmului constă ı̂n faptul că, odată determinate codurile


asociate capetelor segmentului, testele de acceptare sau respingere se
realizează prin operaţii logice rapide.
Dacă ambele capete ale segmentului au codul 0000 atunci, ı̂n mod
banal, se poate decide că segmentul se află ı̂n ı̂ntregime ı̂n interiorul
ferestrei. Acesta este cazul segmentului (AB) din figură.
De asemenea, ı̂n mod banal se poate decide că un segment este ı̂n
ı̂ntregime ı̂n exterior când operaţia AND logic ı̂ntre codurile celor
două puncte conduce la un rezultat diferit de 0. Într-adevăr, ı̂n acest
caz, ambele puncte se află ı̂ntr-un acelaşi semiplan (cel indentificat de
bitul 1 al rezultatului) şi astfel segmentul nu intersectează
dreptunghiul de clipping. Este cazul segmentului (EF ) din figură.
Avem: E (0001) şi F (1001) şi astfel

0001 ∧ 1001 = 0001 6= 0000.

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 11 / 19


Algoritmul Cohen - Sutherland

Puterea algoritmului constă ı̂n faptul că, odată determinate codurile


asociate capetelor segmentului, testele de acceptare sau respingere se
realizează prin operaţii logice rapide.
Dacă ambele capete ale segmentului au codul 0000 atunci, ı̂n mod
banal, se poate decide că segmentul se află ı̂n ı̂ntregime ı̂n interiorul
ferestrei. Acesta este cazul segmentului (AB) din figură.
De asemenea, ı̂n mod banal se poate decide că un segment este ı̂n
ı̂ntregime ı̂n exterior când operaţia AND logic ı̂ntre codurile celor
două puncte conduce la un rezultat diferit de 0. Într-adevăr, ı̂n acest
caz, ambele puncte se află ı̂ntr-un acelaşi semiplan (cel indentificat de
bitul 1 al rezultatului) şi astfel segmentul nu intersectează
dreptunghiul de clipping. Este cazul segmentului (EF ) din figură.
Avem: E (0001) şi F (1001) şi astfel

0001 ∧ 1001 = 0001 6= 0000.

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 11 / 19


Algoritmul Cohen - Sutherland

Dacă ı̂nsă rezultatul operaţiei AND este 0000 se testează care din cele
două puncte extreme se află ı̂n exteriorul dreptunghiului (cel puţin unul
este!!!) şi se ı̂mparte segmentul ı̂n două părţi, din care una poate fi
ı̂nlăturată (deoarece se află ı̂n exteriorul dreptunghiului).
Să luăm cazul segmentului (CD) din figură: D(1000) şi C (0000). Dreapta
cu care se calculează intersecţia este cea care corespunde bitului 1 din
codul punctului. Pentru D se calculează intersecţia D 0 cu dreapta
y = ymax . Noul punct D 0 ı̂l va substitui pe precedentul D. Se scrie din nou
codul şi se reia procedeul.

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 12 / 19


Algoritmul Cohen - Sutherland

Dacă ı̂nsă rezultatul operaţiei AND este 0000 se testează care din cele
două puncte extreme se află ı̂n exteriorul dreptunghiului (cel puţin unul
este!!!) şi se ı̂mparte segmentul ı̂n două părţi, din care una poate fi
ı̂nlăturată (deoarece se află ı̂n exteriorul dreptunghiului).
Să luăm cazul segmentului (CD) din figură: D(1000) şi C (0000). Dreapta
cu care se calculează intersecţia este cea care corespunde bitului 1 din
codul punctului. Pentru D se calculează intersecţia D 0 cu dreapta
y = ymax . Noul punct D 0 ı̂l va substitui pe precedentul D. Se scrie din nou
codul şi se reia procedeul.

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 12 / 19


Algoritmul Cohen - Sutherland

Dacă ı̂nsă rezultatul operaţiei AND este 0000 se testează care din cele
două puncte extreme se află ı̂n exteriorul dreptunghiului (cel puţin unul
este!!!) şi se ı̂mparte segmentul ı̂n două părţi, din care una poate fi
ı̂nlăturată (deoarece se află ı̂n exteriorul dreptunghiului).
Să luăm cazul segmentului (CD) din figură: D(1000) şi C (0000). Dreapta
cu care se calculează intersecţia este cea care corespunde bitului 1 din
codul punctului. Pentru D se calculează intersecţia D 0 cu dreapta
y = ymax . Noul punct D 0 ı̂l va substitui pe precedentul D. Se scrie din nou
codul şi se reia procedeul.

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 12 / 19


Algoritmul Cohen - Sutherland

Pentru exemplul din figură avem:


AB CD EF GH IJ
0000 0000 0001 0100 0100
0000 1000 1001 0010 0010
—————————————————— AND
0000 0000 0001 0000 0000

Concluzie. Rezultat nenul ı̂nseamnă respingere automată: este cazul


segmentului (EF ). Ambii termeni nuli ı̂nseamnă acceptare automată:
cazul segmentului (AB). Celelalte segmente urmează a fi subdivizate.

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 13 / 19


Algoritmul Cohen - Sutherland

Pentru exemplul din figură avem:


AB CD EF GH IJ
0000 0000 0001 0100 0100
0000 1000 1001 0010 0010
—————————————————— AND
0000 0000 0001 0000 0000

Concluzie. Rezultat nenul ı̂nseamnă respingere automată: este cazul


segmentului (EF ). Ambii termeni nuli ı̂nseamnă acceptare automată:
cazul segmentului (AB). Celelalte segmente urmează a fi subdivizate.

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 13 / 19


Algoritmul Cohen - Sutherland

Scriem ı̂n continuare codul C pentru algoritmul Cohen - Sutherland.

Fie P0 (x0 , y0 ), P1 (x1 , y1 ) şi dreptunghiul cu diagonala (xmin , ymin ) −


(xmax , ymax ).

Definim tipul latura


enum latura { sus = 0x8, jos = 0x4, dreapta = 0x2, stanga = 0x1, nul = 0x0 };
şi variabilele outcode0, outcode1, respectiv outcodeOut de tip latura
(care reprezintă codurile capetelor segmentului (P0 P1 ), respectiv al
punctului de intersecţie a segmentului cu o latură a ferestrei de clipping).

Definim de asemenea constantele (booleene) TRUE = 1 şi FALSE = 0.

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 14 / 19


Algoritmul Cohen - Sutherland

Scriem ı̂n continuare codul C pentru algoritmul Cohen - Sutherland.

Fie P0 (x0 , y0 ), P1 (x1 , y1 ) şi dreptunghiul cu diagonala (xmin , ymin ) −


(xmax , ymax ).

Definim tipul latura


enum latura { sus = 0x8, jos = 0x4, dreapta = 0x2, stanga = 0x1, nul = 0x0 };
şi variabilele outcode0, outcode1, respectiv outcodeOut de tip latura
(care reprezintă codurile capetelor segmentului (P0 P1 ), respectiv al
punctului de intersecţie a segmentului cu o latură a ferestrei de clipping).

Definim de asemenea constantele (booleene) TRUE = 1 şi FALSE = 0.

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 14 / 19


Algoritmul Cohen - Sutherland

Scriem ı̂n continuare codul C pentru algoritmul Cohen - Sutherland.

Fie P0 (x0 , y0 ), P1 (x1 , y1 ) şi dreptunghiul cu diagonala (xmin , ymin ) −


(xmax , ymax ).

Definim tipul latura


enum latura { sus = 0x8, jos = 0x4, dreapta = 0x2, stanga = 0x1, nul = 0x0 };
şi variabilele outcode0, outcode1, respectiv outcodeOut de tip latura
(care reprezintă codurile capetelor segmentului (P0 P1 ), respectiv al
punctului de intersecţie a segmentului cu o latură a ferestrei de clipping).

Definim de asemenea constantele (booleene) TRUE = 1 şi FALSE = 0.

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 14 / 19


Algoritmul Cohen - Sutherland

Scriem ı̂n continuare codul C pentru algoritmul Cohen - Sutherland.

Fie P0 (x0 , y0 ), P1 (x1 , y1 ) şi dreptunghiul cu diagonala (xmin , ymin ) −


(xmax , ymax ).

Definim tipul latura


enum latura { sus = 0x8, jos = 0x4, dreapta = 0x2, stanga = 0x1, nul = 0x0 };
şi variabilele outcode0, outcode1, respectiv outcodeOut de tip latura
(care reprezintă codurile capetelor segmentului (P0 P1 ), respectiv al
punctului de intersecţie a segmentului cu o latură a ferestrei de clipping).

Definim de asemenea constantele (booleene) TRUE = 1 şi FALSE = 0.

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 14 / 19


Algoritmul Cohen - Sutherland

Calcul cod
Scriem mai ı̂ntâi funcţia care calculează codul unui punct ı̂n raport cu
dreptunghiul de clipping. Aceasta se numeşte Calcul outcode şi este de
tip latura. Să mai facem observaţia că vom folosi operatorii | şi & (anume
sau, respectiv şi bit per bit). Avem:
latura Calcul outcode (double x, double y,
/* coordonatele punctului */
int xmin, int ymin, int xmax, int ymax)
/* coordonatele ferestrei de clipping */
{ latura code = nul;
if (y > ymax) code = code | sus;
else if (y < ymin) code = code | jos;
if (x > xmax) code = code | dreapta;
else if (x < xmin) code = code | stanga;
return code;
}
Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 15 / 19
Algoritmul Cohen - Sutherland

Calcul cod
Scriem mai ı̂ntâi funcţia care calculează codul unui punct ı̂n raport cu
dreptunghiul de clipping. Aceasta se numeşte Calcul outcode şi este de
tip latura. Să mai facem observaţia că vom folosi operatorii | şi & (anume
sau, respectiv şi bit per bit). Avem:
latura Calcul outcode (double x, double y,
/* coordonatele punctului */
int xmin, int ymin, int xmax, int ymax)
/* coordonatele ferestrei de clipping */
{ latura code = nul;
if (y > ymax) code = code | sus;
else if (y < ymin) code = code | jos;
if (x > xmax) code = code | dreapta;
else if (x < xmin) code = code | stanga;
return code;
}
Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 15 / 19
Algoritmul Cohen - Sutherland

Prezentăm acum funcţia CohenSutherland care realizează clipping


folosind algoritmul descris anterior.
void CohenSutherland (double x0, double y0, double x1, double y1,
/* coordonatele capetelor segmentelor care initial sunt
intregi, insa dupa o decupare valorile pot deveni reale */
int xmin, int ymin, int xmax, int ymax)
/* coordonatele dreptunghiului de clipping */
{
latura outcode0, outcode1, outcodeOut;
int accept, done;
/* accept - pentru testul de acceptare */
/* done - pentru testul de respingere */
accept = FALSE; done = FALSE;
double x, y; /* coordonatele punctelor de intersectie */
outcode0 = Calcul outcode(x0, y0, xmin, ymin, xmax, ymax);
outcode1 = Calcul outcode(x1, y1, xmin, ymin, xmax, ymax);
do
Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 16 / 19
Algoritmul Cohen - Sutherland

{
if (! (outcode0 | outcode1))
{ /* acceptare triviala si iesire */
accept = TRUE; done = TRUE;
}
else if (outcode0 & outcode1)
done = TRUE; /* respingere triviala si iesire */
else { /* nu avem nici acceptare si nici respingere triviala
asa ca vom face efectiv clipping */
if (outcode0) outcodeOut = outcode0;
else outcodeOut = outcode1;
/* se determina capatul exterior */
if (outcodeOut & sus)
{ /* se face clip cu latura de sus */
x = x0+float(x1 − x0)*(ymax − y0)/float(y1 − y0);
y = ymax;
}

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 17 / 19


Algoritmul Cohen - Sutherland

else if (outcodeOut & jos)


{ /* se face clip cu latura de jos */
x = x0+float (x1 − x0)*(ymin − y0)/float(y1 − y0);
y = ymin;
}
else if (outcodeOut & dreapta)
{ /* se face clip cu latura din dreapta */
y = y0+float(y1 − y0)*(xmax − x0)/float (x1 − x0);
x = xmax;
}
else if (outcodeOut & stanga)
{ /* se face clip cu latura din stanga */
y = y0+float(y1 − y0)*(xmin − x0)/float (x1 − x0);
x = xmin;
}

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 18 / 19


Algoritmul Cohen - Sutherland

/* acum se elimina capatul exterior */


if (outcodeOut == outcode0) {
x0 = x; y0 = y;
outcode0 = Calcul outcode(x0, y0, xmin, ymin, xmax, ymax);
} else {
x1=x; y1=y;
outcode1 = Calcul outcode(x1, y1, xmin, ymin, xmax, ymax);
}
}
} while (! done);
if (accept) line(x0, y0, x1, y1);
} /* end functie */

Marian Ioan MUNTEANU (UAIC) Clipping 22 noiembrie 2011 19 / 19

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