Documente Academic
Documente Profesional
Documente Cultură
Curs 08 An3
Curs 08 An3
22 noiembrie 2011
Cuprins
Ce ı̂nseamnă clipping?
Ce ı̂nseamnă clipping?
Ce ı̂nseamnă clipping?
Ce ı̂nseamnă clipping?
Ce ı̂nseamnă clipping?
Ce ı̂nseamnă clipping?
Ce ı̂nseamnă?
Ce ı̂nseamnă?
Ce ı̂nseamnă?
Ce ı̂nseamnă?
Ce ı̂nseamnă?
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.
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.
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.
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
{
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;
}