Бресенхамов алгоритам за цртање круга

Бресенхамов алгоритам за цртање круга

Није лако приказати непрекидан глатки лук на екрану рачунара јер је екран нашег рачунара направљен од пиксела организованих у матричном облику. Дакле, да бисмо нацртали круг на екрану рачунара, увек треба да изаберемо најближе пикселе од штампаног пиксела како би могли да формирају лук. Постоје два алгоритма за ово:

  1. Алгоритам за цртање круга у средини
  2. Бресенхамов алгоритам за цртање круга

Већ смо разговарали о Алгоритам за цртање круга у средини у нашем претходном посту. У овом посту ћемо разговарати о Бресенхамовом алгоритму за цртање круга. 

Оба ова алгоритма користе кључну особину круга да је веома симетричан. Дакле, за целих 360 степени круга поделићемо га на 8 делова сваки октант од 45 степени. Да бисмо то урадили користићемо Бресенхамов алгоритам круга за израчунавање локација пиксела у првом октанту од 45 степени. Претпоставља се да је центар круга на почетку. Дакле, за сваки пиксел (к и) који израчунава цртамо пиксел у сваком од 8 октаната круга као што је приказано испод: 

За пиксел (ки) сви могући пиксели у 8 октанатаЗа пиксел (ки) сви могући пиксели у 8 октаната


Сада ћемо видети како израчунати локацију следећег пиксела из претходно познате локације пиксела (к и). У Бресенхамовом алгоритму у било којој тачки (к и) имамо две опције или да изаберемо следећи пиксел на истоку, тј. (к+1 и) или на југоистоку, тј. (к+1 и-1).
 

круг 2


А ово се може одлучити коришћењем параметра одлуке д као: 
 

  • Ако је д > 0 онда (к+1 и-1) треба изабрати као следећи пиксел јер ће бити ближи луку.
  • иначе (к+1 и) треба изабрати као следећи пиксел.


Сада да нацртамо круг за дати полупречник 'р' и центар (кц иц) Почећемо од (0 р) и кретати се у првом квадранту до к=и (тј. 45 степени). Требало би да почнемо од наведеног почетног услова: 
 

 d = 3 - (2 * r)   
x = 0
y = r

Сада ћемо за сваки пиксел урадити следеће операције:  

  1. Поставите почетне вредности (кц иц) и (к и).
  2. Поставите параметар одлуке д на д = 3 – (2 * р).
  3. Позовите функцију дравЦирцле(инт кц инт иц инт к инт и).
  4. Понављајте следеће кораке до к <= y:
    • Ако д < 0 set d = d + (4 * x) + 6.
    • Иначе поставите д = д + 4 * (к – и) + 10 и смањите и за 1.
    • Повећајте вредност к.
    • Позовите функцију дравЦирцле(инт кц инт иц инт к инт и).

функција дравЦирцле():  

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  );   }   

Испод је Ц имплементација горњег приступа. 

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  ;   }   

Излаз: 
 

кружити


Предности  

  • То је једноставан алгоритам.
  • Може се лако имплементирати
  • Потпуно се заснива на једначини круга, тј. х 2 2 2

Недостаци  

  • Постоји проблем са прецизношћу приликом генерисања поена.
  • Овај алгоритам није погодан за сложене и високе графичке слике.
Креирај квиз