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
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. |
Personaje din literatura |
Baltagul – caracterizarea personajelor |
Caracterizare Alexandru Lapusneanul |
Caracterizarea lui Gavilescu |
Caracterizarea personajelor negative din basmul |
Tehnica si mecanica |
Cuplaje - definitii. notatii. exemple. repere istorice. |
Actionare macara |
Reprezentarea si cotarea filetelor |
Geografie |
Turismul pe terra |
Vulcanii Și mediul |
Padurile pe terra si industrializarea lemnului |
Termeni si conditii |
Contact |
Creeaza si tu |