Algoritmus pro kreslení Bresenhamova kruhu
Není snadné zobrazit souvislý hladký oblouk na obrazovce počítače, protože obrazovka našeho počítače je vyrobena z pixelů organizovaných v maticové formě. Abychom mohli na obrazovce počítače nakreslit kruh, měli bychom vždy vybrat nejbližší pixely z vytištěného pixelu, aby mohly tvořit oblouk. K tomu existují dva algoritmy:
- Algoritmus kreslení kruhu středního bodu
- Algoritmus kreslení Bresenhamova kruhu
Již jsme diskutovali o Algoritmus kreslení kruhu středního bodu v našem předchozím příspěvku. V tomto příspěvku budeme diskutovat o algoritmu kreslení Bresenhamova kruhu.
Oba tyto algoritmy využívají klíčovou vlastnost kruhu, že je vysoce symetrický. Takže celý kruh o 360 stupních rozdělíme na 8 částí, každý oktan 45 stupňů. K tomu použijeme Bresenhamův kruhový algoritmus pro výpočet umístění pixelů v prvním oktantu 45 stupňů. Předpokládá, že kružnice je vystředěna na počátek. Takže pro každý pixel (x y), který vypočítá, nakreslíme pixel v každém z 8 oktantů kruhu, jak je znázorněno níže:
Pro pixel (xy) všechny možné pixely v 8 oktantech
Nyní uvidíme, jak vypočítat umístění dalšího pixelu z dříve známého umístění pixelu (x y). V Bresenhamově algoritmu máme v libovolném bodě (x y) dvě možnosti, buď zvolit další pixel na východě, tj. (x+1 y), nebo na jihovýchodě, tj. (x+1 y-1).
A to lze rozhodnout pomocí rozhodovacího parametru d jako:
- Je-li d > 0, pak (x+1 y-1) je třeba vybrat jako další pixel, protože bude blíže k oblouku.
- jinak (x+1 y) je třeba vybrat jako další pixel.
Nyní k nakreslení kružnice pro daný poloměr 'r' a střed (xc yc) Začneme od (0 r) a posuneme se v prvním kvadrantu do x=y (tj. 45 stupňů). Měli bychom začít od uvedené počáteční podmínky:
d = 3 - (2 * r)
x = 0
y = rNyní pro každý pixel provedeme následující operace:
- Nastavte počáteční hodnoty (xc yc) a (x y).
- Nastavte rozhodovací parametr d na d = 3 – (2 * r).
- Zavolejte funkci drawCircle(int xc int yc int x int y).
- Opakujte následující kroky až do x <= y:
- Pokud d < 0 set d = d + (4 * x) + 6.
- Jinak nastavte d = d + 4 * (x – y) + 10 a snižte y o 1.
- Zvyšte hodnotu x.
- Zavolejte funkci drawCircle(int xc int yc int x int y).
Funkce 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 ); }Níže je C implementace výše uvedeného přístupu.
CPP// 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 ; } výstup:
![]()
Výhody
- Je to jednoduchý algoritmus.
- Lze jej snadno implementovat
- Je zcela založen na rovnici kruhu, tj. x 2 +y 2 =r 2
Nevýhody
- Při generování bodů je problém s přesností.
- Tento algoritmus není vhodný pro složité a vysoce grafické obrázky.