Algoritmus kreslenia Bresenhamovho kruhu

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:

  1. Algoritmus kreslenia kruhu stredného bodu
  2. 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 oktantochPre 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).
 

kruh 2


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 = r

Teraz pre každý pixel vykonáme nasledujúce operácie:  

  1. Nastavte počiatočné hodnoty (xc yc) a (x y).
  2. Rozhodovací parameter d nastavte na d = 3 – (2 * r).
  3. Zavolajte funkciu drawCircle(int xc int yc int x int y).
  4. 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: 
 

krúžkovanie


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.
Vytvoriť kvíz