Algoritmus kreslenia Bresenhamovho kruhu
Nie je ľahké zobraziť súvislý hladký oblúk na obrazovke počítača, pretože obrazovka nášho počítača je vyrobená z pixelov usporiadaných v maticovej forme. Takže na nakreslenie kruhu na obrazovke počítača by sme mali vždy vybrať najbližšie pixely z vytlačeného pixelu, aby mohli tvoriť oblúk. Na to existujú dva algoritmy:
- Algoritmus kreslenia kruhu stredného bodu
- Algoritmus kreslenia Bresenhamovho kruhu
Už sme diskutovali o Algoritmus kreslenia kruhu stredného bodu v našom predchádzajúcom príspevku. V tomto príspevku budeme diskutovať o algoritme kreslenia Bresenhamovho kruhu.
Oba tieto algoritmy využívajú kľúčovú vlastnosť kruhu, že je vysoko symetrický. Takže pre celý 360 stupňový kruh ho rozdelíme na 8 častí, každý oktan 45 stupňov. Aby sme to dosiahli, použijeme Bresenhamov kruhový algoritmus na výpočet umiestnenia pixelov v prvom oktante 45 stupňov. Predpokladá, že kružnica je vycentrovaná na počiatok. Takže pre každý pixel (x y), ktorý vypočíta, nakreslíme pixel v každom z 8 oktantov kruhu, ako je uvedené nižšie:
Pre pixel (xy) všetky možné pixely v 8 oktantoch
Teraz uvidíme, ako vypočítať umiestnenie ďalšieho pixelu z predtým známeho umiestnenia pixelu (x y). V Bresenhamovom algoritme máme v ktoromkoľvek bode (x y) dve možnosti, buď zvoliť ďalší pixel na východe, t.j. (x+1 y) alebo na juhovýchode, t.j. (x+1 y-1).
A to sa dá rozhodnúť pomocou rozhodovacieho parametra d ako:
- Ak d > 0, potom (x+1 y-1) sa má zvoliť ako ďalší pixel, pretože bude bližšie k oblúku.
- inak (x+1 y) sa vyberie ako ďalší pixel.
Teraz, aby sme nakreslili kružnicu pre daný polomer 'r' a stred (xc yc) Začneme od (0 r) a budeme sa pohybovať v prvom kvadrante až po x=y (t.j. 45 stupňov). Mali by sme začať od uvedenej počiatočnej podmienky:
d = 3 - (2 * r)
x = 0
y = rTeraz pre každý pixel vykonáme nasledujúce operácie:
- Nastavte počiatočné hodnoty (xc yc) a (x y).
- Rozhodovací parameter d nastavte na d = 3 – (2 * r).
- Zavolajte funkciu drawCircle(int xc int yc int x int y).
- Opakujte nasledujúce kroky až do x <= y:
- Ak d < 0 set d = d + (4 * x) + 6.
- Inak nastavte d = d + 4 * (x – y) + 10 a znížte y o 1.
- Zvýšte hodnotu x.
- Zavolajte funkciu drawCircle(int xc int yc int x int y).
Funkcia 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 ); }Nižšie je C implementácia vyššie uvedeného prí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.
- Dá sa jednoducho implementovať
- Je to úplne založené na rovnici kruhu, tj x 2 +y 2 =r 2
Nevýhody
- Pri generovaní bodov je problém s presnosťou.
- Tento algoritmus nie je vhodný pre zložité a vysoko grafické obrázky.