Creeaza.com - informatii profesionale despre


Evidentiem nevoile sociale din educatie - Referate profesionale unice
Acasa » scoala » informatica » grafica design

Elemente de grafica de calculator - Trasarea segmentelor de dreapta


Elemente de grafica de calculator



Formele grafice complexe sunt sintetizate cu ajutorul unor elemente grafice ("primitive grafice") simple: segmente de dreapta, cercuri, curbe, suprafete elementare (petice). Pentru ca majoritatea aplicatiilor graficii de calculator sunt interactive sau necesita functionare in timp real cu frecvete de schimbare a cadrelor compatibile cu cele din televiziune, sunt necesare metode de trasare rapide. Prin trasare, intelegem redarea pe un ecran cu rezolutie finita sau tiparirea folosind, de asemenea, o imprimanta cu rezolutie finita. Procesul prin care o forma grafica, precizata in calculator cu ajutorul unui numar redus de parametri, este transpusa pe ecran sau hartia de imprimare mai este denumit si conversie de scanare.


Trasarea segmentelor de dreapta


1.Metoda diferentiala


Ecuatia unei drepte se poate scrie:

(1.1)


Rezulta forma iterativa a ecuatiei dreptei:

(1.2)


Segmentul de dreapta este definit de punctele de pornire si de oprire (xp,yp), (xo,yo).

Alegerea incrementului:

mic: ineficient

mare: linia discontinua

Optim: max(Δx Δy) = 1.



2. Algoritmul DDA pentru trasarea segmentelor de dreapta


// DDA: "differential digital analyzer"

lineDDA int xPornire, int yPornire, int xOprire, int yOprire )


} // terminat functie


Avantaj: simplu de programat

Dezavantaj: necesita operatii cu numere flotante in bucla principala





3. Algoritmul Bresenham pentru segmente de dreapta


Este mai eficient decat DDA, pentru ca evita complet operatiile cu numere flotante. Se preteaza si la implementare hardware cu procesoare ieftine (nu necesita nici inmultiri sau impartiri).






Fig. 1. Eroarea la un pas pe directia orizontala


Presupunem ca dreapta trasata apartine primului octant (panta m intre 0 si 450). Rezulta ca numarul de pasi este egal cu xOprire-xPornire. La fiecare pas se incrementeaza x. La unii pasi se incrementeaza si y: cand eroarea cumulata este mai mare decat 0.5. Eroarea cumulata se defineste ca distanta la care se afla punctul curent trasat fata de dreapta teoretica. Un pas pe directia x creste eroarea cumulata cu


.

(1.3)


Un pas pe directia y reduce eroarea cumulata cu 1.

Putem acum construi un algoritm care traseaza un pixel al dreptei la fiecare pas, bazat pe bucla:

for(x=xPornire; x<=xOprire;x++)


}


Problema este ca variabila eroare trebuie sa fie flotanta in implementarea de mai sus. acest lucru poate fi evitat, daca inmultim ecuatia eroarea din (1.3) cu 2*(xOprire-xPornire). In acest caz, deplasarea pe directia x va creste noua eroare cu

DY= 2*(yOprire-yPornire).

Similar, deplasarea pe directia y reduce eroarea cu

DX=2*(xOprire-xPornire).


In expresia if(), comparatia ar trebui sa se faca acum cu xOprire-xPornire. Pentru ca o comparatie cu 0 este mai rapida (testare de semn), putem initializa eroarea cu ─( xOprire-xPornire)= xPornire-xOprire si testa in bucla eroarea pentru zero. Rezulta urmatorul algoritm, datorat lui Bresnham:


// "algoritm Bresenham pentru segmente de dreapta in primul octant"

// versiune C++

lineBresenheim int xPornire, int yPornire, int xOprire, int yOprire )



} // terminat functia lineBresenham()

Drepte ce nu apartin primului octant se traseaza similar (prin simetrie).




Politica de confidentialitate


.com Copyright © 2024 - Toate drepturile rezervate.
Toate documentele au caracter informativ cu scop educational.