You are on page 1of 12

Algoritmul de bisectiune

Introducere
Calculatorul este o masina de prelucrare a informatiilor. Acesta este un instrument de stocare,
manipulare si corelare a datelor. Exista numeroase moduri de a comunica informatiile prelucrate
utilizatorului, dar grafica pe calculator este cea mai eficienta si cea mai des utilizata modalitate
pentru a face acest lucrul.

Decuparea 2D
Procedura care identifica aceea portiune a unei imagini care este fie in interiorul, fie in afara unei
anumite regiuni se numeste decupare. Portiunea dupa care un obiect trebuie sa fie decupat se
numeste fereastra de vizualizare. Aceasta are de obicei o forma dreptunghiulara.

Fig.1

Algoritmul de decupare determina ce puncte, linii sau segmente se afla in interiorul unei ferestre
de decupare. Aceste puncte , linii sau segmente sunt retinute si apoi afisate. Toate celelalte
elemente sunt inlaturate.

Decuparea segmentelor in raport cu o fereasta de vizualizare


1
Toate segmentele intra in una din urmatoarele categorii:

1.Vizibile , daca ambele capete ale segmentului sunt in interiorul ferestrei de vizualizare.

2.Invizibile, segmentul se afla in exteriorul ferestrei.

3.Partial vizibile (segmente ce urmeaza a fi taiate). Segmentul este partial vizibil cand doar o
parte a acestuia se afla in interiorul ferestrei de decupare.

Fig.2

In Fig.2 segmentul AB intra in categoria 1 (vizibil); segmentele CD si EF in categoria 2


(invizibile); iar segmentele IJ si KL sunt in categoria 3 (partial vizibile).

Algoritmul de bisectiune
Algoritmul de bisectiune este un algoritm de decupare bazat pe strategia divide si
cucereste. Ca si in cazul altor algoritmi de decupare, initial segmentul este testat daca este
vizibil. Daca segmentul este complet vizibill este desenat, in caz contrar segmentul este respins.

Daca segmentul este partial vizibil atunci este impartit in doua parti egale. Testul de vizibilitate
este apoi aplicat fiecarei jumatati.

Procesul de impartire este repetat pana cand obtinem segmente complet vizibile si
segmente complet invizibile. Intr-o rezolutie standard a unui ecran, pentru o lungime de linie de
512 pixeli (chiar si in cel mai rau caz), sunt necesare maxim 9 puncte de mijloc (29=512 ).

2
Fig.3

Demonstratie a algoritmului de bisectiune. (linia AB este recursive impartita in doua parti egale,
atat timp cat segmentele de linie sunt generate in interiorul ferestrei de decupare)

Exemplu:
Dupa cum se poate vedea in Fig.4, segmentul P1 P2 este partial vizibil. Este impartit in doua parti
egale P1 P3 si P3 P 2.

Coordonatele punctului de mijloc ( x m , , y m) ale unui segment dat de punctele P1( x 1 , y 1) si P2(
x 2 , y 2) sunt date de relatiile:

x 1+ x 2
x m=
2

y1 + y2
ym=
2

Vizibilitatea ambelor segmente este testate si se descopera ca sunt partial vizibile. Ambele
segmente sunt subdivizate in parti egale prin noile puncte de mijloc, P4 si P5. Se observa ca
segmentele P1 P 4 si P5 P 2 sunt complet invizibile si astfel sunt response. Dar segmentul P3 P 5
este complet vizibil si prin urmare este desenat. Segmentul ramas P4 P3 este partial vizibil, in
timp ce P4 P6 este partial vizibil. Astfel P6 P3 va fi trasat, iar P4 P6 va fi impartit prin mijlocul P7
.

Acum se observa ca segmentul P4 P7 este complet invizibil, pe cand P7 P 6 este complet vizibil si
ca nu exista alte segmente partial vizibile.

3
Fig.4

Pasii algoritmului de bisectiune:


1.Se citesc capetele segmentului, de exemplu P1( x 1 , y 1) si P2( x 2 , y 2)

2.Se citesc doua puncte ce formeaza colturile ferestrei de decupare, de exemplu punctele stanga
sus si coltul dreapta jos: (W x ,W y ) si (W x ,W y )
1 1 2 2

4
Fig.5

3.Atribuim coduri de regiune pentru cele doua capete folosind urmatorii pasi:

Set Bit 1 – if (x<W x )


1

Set Bit 2 – if (x>W x )


2

Set Bit 3 – if (y<W y )


1

Set Bit 4 – if (y>W y )


2

4.Se verifica vizibilitatea liniei.

a)Daca codurile de regiune pentru ambele capete ale segmetului sunt 0, atunci segmentul
este complet vizibil, astfel segmentul este desenat si se trece la punctual 6.

b)Daca codurile de regiune pentru ambele capete nu sunt 0 si adunarea lor logica este
diferita de 0, atunci segmentul este complet invizibil, deci segmentul este respins si se trece la
pasul 6;

c)Daca codurile de regiune pentru doua capete nu satisfac conditiile de la pasul 4a) si 4b)
atunci este segmentul este partial vizibil;

5.Segmentul partial vizibil este impartit in parti egale si pentru fiecare segment nou se repete
pasii 3 pana la 5 ai algoritmului, pana cand obtinem doar segmente complet vizibile si segmente
complet invizibile.

Enuntul problemei
Decuparea segmentelor in raport cu o fereastra de vizualizare. Algoritmul de bisectiune.

Codul sursa
5
#include <stdio.h>

#include <conio.h>

#include <graphics.h>

#include <math.h>

#include <dos.h>

#include <stdlib.h>

typedef struct coordinates

{ int x;

int y;

char code[4];

}pt;

pt p1,p2,ptemp;

void drawwindow();

void drawline(pt p1,pt p2, int c1);

pt setcode(pt p);

int visibility(pt p1,pt p2);

pt resetendpt(pt p1,pt p2);

void midsub(pt p1,pt p2);

void main()

{ int gd=DETECT,gm,v;

detectgraph(&gd,&gm);

initgraph(&gd,&gm,"c:\\tclite\\bgi");

cleardevice();

printf("Introduceti primul capat al segmentului (x1,y1)\t");

6
scanf("%d %d",&p1.x,&p1.y);

printf("\nIntroduceti cel de-al doilea capat al segmentului (x2,y2) \t");

scanf("%d %d",&p2.x,&p2.y);

cleardevice();

drawwindow();

getch();

drawline(p1,p2,15);

getch();

cleardevice();

drawwindow();

midsub(p1,p2);

getch();

closegraph();

void midsub(pt p1,pt p2)

{pt mid;

int v;

p1=setcode(p1);

p2=setcode(p2);

v=visibility(p1,p2);

delay(100);

switch(v)

case 0:

drawline(p1,p2,15);

7
break;

case 1:

break;

case 2:

mid.x=p1.x+(p2.x-p1.x)/2;

mid.y=p1.y+(p2.y-p1.y)/2;

midsub(p1,mid);

mid.x=mid.x+1;

mid.y=mid.y+1;

midsub(mid,p2);

break;

void drawwindow()

{setcolor(RED);

line(150,100,450,100);

line(450,100,450,400);

line(450,400,150,400);

line(150,400,150,100);

8
void drawline(pt p1,pt p2,int c1)

{setcolor(c1);

line(p1.x,p1.y,p2.x,p2.y);

pt setcode(pt p)

pt ptemp;

if(p.y>400)

ptemp.code[0]='1';

else

ptemp.code[0]='0';

if(p.y<100)

ptemp.code[1]='1';

else

ptemp.code[1]='0';

if(p.x>450)

ptemp.code[2]='1';

else

ptemp.code[2]='0';

if(p.x<150)

ptemp.code[3]='1';

else

ptemp.code[3]='0';

ptemp.x=p.x;

ptemp.y=p.y;

return(ptemp);

9
}

int visibility(pt p1,pt p2)

int i,flag=0;

for(i=0;i<4;i++)

if((p1.code[i]!='0')||(p2.code[i]!='0'))

flag=1;

if(flag==0)

return(0);

for(i=0;i<4;i++)

if((p1.code[i]==p2.code[i])&&(p1.code[i]=='1'))

flag=0;

if(flag==0)

return(1);

return(2);

Print screen
Pentru coordonatele: x1=170, y1=80, x2=300 si y2=500 se va afisa:
10
Concluzii
Spre deosebire de algoritmul de decupare Cohen Sutherland care necesita calculaterea
punctului de intersectie dintre segment si fereastra de decupare, algoritmul de bisectiune este
mult mai rapid, anumite calcule putand fi evitate prin impartirea repetata a segmentului in
punctul sau de mijloc.

Algoritmul desi la prima vedere pare incet, este destul de eficient, fiind cunoscut pentru
simplicitatea si viteza sa mare. Daca algoritmul de bisectiune este implementat in hardware,
atunci acesta functioneaza foarte rapid, deoarece inmultirea si impartirea cu 2 sunt foarte rapide.

BIBLIOGRAFIE:
11
1. “Computer Graphics”, Isrd Group

2. “Computer Graphics”, Bhatia

3. “Computer Graphics And Multimedia”, A.P.Godse, D.A.Godse

4. “Fundamentals of Computer Graphics and Multimedia”, D.P.Mukherjee

12

You might also like