logo

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

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

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

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

миливецрицлет

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



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


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

круг 2' loading='lazy' title=


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

  • Ако је д > 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; } 

Излаз: 
 

кружити' loading='lazy' title=


Предности  

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

Недостаци  

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