Nije lako prikazati kontinuirani glatki luk na zaslonu računala jer je zaslon našeg računala napravljen od piksela organiziranih u obliku matrice. Dakle, da bismo nacrtali krug na zaslonu računala, uvijek bismo trebali odabrati najbliže piksele iz tiskanog piksela kako bi mogli oblikovati luk. Postoje dva algoritma za to:
- Algoritam za crtanje kruga srednje točke
- Bresenhamov algoritam za crtanje kruga
Već smo razgovarali o Algoritam za crtanje kruga srednje točke u našem prethodnom postu. U ovom postu ćemo raspravljati o Bresenhamovom algoritmu za crtanje kruga.
vrsta u Javi
Oba ova algoritma koriste ključnu značajku kruga da je visoko simetričan. Dakle, cijeli krug od 360 stupnjeva podijelit ćemo na 8 dijelova, svaki oktant od 45 stupnjeva. Da bismo to učinili, koristit ćemo Bresenhamov kružni algoritam za izračun lokacija piksela u prvom oktantu od 45 stupnjeva. Pretpostavlja se da je krug u središtu ishodišta. Dakle, za svaki piksel (x y) koji izračunava crtamo piksel u svakom od 8 oktanata kruga kao što je prikazano u nastavku:
Za piksel (xy) svi mogući pikseli u 8 oktanta
Sada ćemo vidjeti kako izračunati lokaciju sljedećeg piksela iz prethodno poznate lokacije piksela (x y). U Bresenhamovom algoritmu u bilo kojoj točki (x y) imamo dvije opcije ili odabrati sljedeći piksel na istoku, tj. (x+1 y) ili na jugoistoku, tj. (x+1 y-1).
I to se može odlučiti korištenjem parametra odluke d kao:
- Ako je d > 0 tada (x+1 y-1) treba odabrati kao sljedeći piksel jer će biti bliže luku.
- inače (x+1 y) treba odabrati kao sljedeći piksel.
Sada da nacrtamo krug za zadani radijus 'r' i centar (xc yc). Počet ćemo od (0 r) i kretati se u prvom kvadrantu do x=y (tj. 45 stupnjeva). Trebalo bi krenuti od navedenog početnog stanja:
d = 3 - (2 * r)
x = 0
y = r
Sada ćemo za svaki piksel napraviti sljedeće operacije:
- Postavite početne vrijednosti (xc yc) i (x y).
- Postavite parametar odluke d na d = 3 – (2 * r).
- Pozovite funkciju drawCircle(int xc int yc int x int y).
- Ponavljajte sljedeće korake do x<= y:
- Ako d< 0 set d = d + (4 * x) + 6.
- Inače postavite d = d + 4 * (x – y) + 10 i smanjite y za 1.
- Povećajte vrijednost x.
- Pozovite funkciju drawCircle(int xc int yc int x int y).
funkcija drawCircle():
CPP// function to draw all other 7 pixels // present at symmetric position drawCircle(int xc int yc int x int y) { putpixel(xc+x yc+y RED); putpixel(xc-x yc+y RED); putpixel(xc+x yc-y RED); putpixel(xc-x yc-y RED); putpixel(xc+y yc+x RED); putpixel(xc-y yc+x RED); putpixel(xc+y yc-x RED); putpixel(xc-y yc-x RED); }
Ispod je C implementacija gornjeg pristupa.
gomila i hrpa sortiratiCPP
// C-program for circle drawing // using Bresenham’s Algorithm // in computer-graphics #include #include #include // Function to put pixels // at subsequence points void drawCircle(int xc int yc int x int y){ putpixel(xc+x yc+y RED); putpixel(xc-x yc+y RED); putpixel(xc+x yc-y RED); putpixel(xc-x yc-y RED); putpixel(xc+y yc+x RED); putpixel(xc-y yc+x RED); putpixel(xc+y yc-x RED); putpixel(xc-y yc-x RED); } // Function for circle-generation // using Bresenham's algorithm void circleBres(int xc int yc int r){ int x = 0 y = r; int d = 3 - 2 * r; drawCircle(xc yc x y); while (y >= x){ // check for decision parameter // and correspondingly // update d y if (d > 0) { y--; d = d + 4 * (x - y) + 10; } else d = d + 4 * x + 6; // Increment x after updating decision parameter x++; // Draw the circle using the new coordinates drawCircle(xc yc x y); delay(50); } } int main() { int xc = 50 yc = 50 r = 30; int gd = DETECT gm; initgraph(&gd &gm ''); // initialize graph circleBres(xc yc r); // function call return 0; }
Izlaz:

Prednosti
- To je jednostavan algoritam.
- Može se jednostavno implementirati
- U potpunosti se temelji na jednadžbi kruga, tj. x2+y2=r2
Nedostaci
- Postoji problem točnosti prilikom generiranja bodova.
- Ovaj algoritam nije prikladan za složene i visoko grafičke slike.