Algoritmus pro kreslení Bresenhamova kruhu

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:

  1. Algoritmus kreslení kruhu středního bodu
  2. 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 oktantechPro 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).
 

kruh 2


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

Nyní pro každý pixel provedeme následující operace:  

  1. Nastavte počáteční hodnoty (xc yc) a (x y).
  2. Nastavte rozhodovací parametr d na d = 3 – (2 * r).
  3. Zavolejte funkci drawCircle(int xc int yc int x int y).
  4. 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: 
 

kroužkování


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.
Vytvořit kvíz