Алгоритм малювання кола Брезенхема

Алгоритм малювання кола Брезенхема

Непросто відобразити безперервну плавну дугу на екрані комп’ютера, оскільки екран нашого комп’ютера складається з пікселів, організованих у формі матриці. Отже, щоб намалювати коло на екрані комп’ютера, ми завжди повинні вибирати найближчі пікселі з друкованого пікселя, щоб вони могли утворити дугу. Для цього є два алгоритми:

  1. Алгоритм малювання кола Mid-Point
  2. Алгоритм малювання кола Брезенхема

Ми вже обговорювали Алгоритм малювання кола Mid-Point у нашій попередній публікації. У цій публікації ми обговоримо алгоритм малювання кола Брезенхема. 

Обидва ці алгоритми використовують ключову властивість кола — його високу симетричність. Таким чином, для цілих 360 градусів кола ми розділимо його на 8 частин, кожен октант 45 градусів. Для цього ми використаємо круговий алгоритм Брезенхема для розрахунку розташування пікселів у першому октанті 45 градусів. Він припускає, що коло має центр у початку координат. Отже, для кожного пікселя (x y), який він обчислює, ми малюємо піксель у кожному з 8 октантів кола, як показано нижче: 

Для пікселя (xy) усі можливі пікселі у 8 октантахДля пікселя (xy) усі можливі пікселі у 8 октантах


Тепер ми побачимо, як обчислити розташування наступного пікселя з попередньо відомого розташування пікселя (x y). В алгоритмі Брезенхема в будь-якій точці (x y) ми маємо два варіанти: вибрати наступний піксель на сході, тобто (x+1 y), або на південному сході, тобто (x+1 y-1).
 

коло 2


І це можна вирішити за допомогою параметра рішення d як: 
 

  • Якщо d > 0, то (x+1 y-1) потрібно вибрати як наступний піксель, оскільки він буде ближче до дуги.
  • інакше (x+1 y) має бути обрано наступним пікселем.


Тепер, щоб намалювати коло для заданого радіуса 'r' і центру (xc yc). Ми почнемо з (0 r) і рухатимемося в першому квадранті до x=y (тобто 45 градусів). Ми повинні почати з перелічених початкових умов: 
 

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

Тепер для кожного пікселя ми виконаємо такі операції:  

  1. Установіть початкові значення (xc yc) і (x y).
  2. Встановіть параметр рішення d на d = 3 – (2 * r).
  3. Викличте функцію drawCircle(int xc int yc int x int y).
  4. Повторюйте наступні дії до x <= y:
    • Якщо d < 0 set d = d + (4 * x) + 6.
    • Інакше встановіть d = d + 4 * (x – y) + 10 і зменште y на 1.
    • Збільште значення x.
    • Викличте функцію drawCircle(int xc int yc int x int y).

функція 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  );   }   

Нижче наведено реалізацію вищезазначеного підходу на C. 

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

Вихід: 
 

закруглення


Переваги  

  • Це простий алгоритм.
  • Його можна легко реалізувати
  • Він повністю заснований на рівнянні кола, тобто x 2 +y 2 =r 2

Недоліки  

  • Існує проблема точності під час генерування очок.
  • Цей алгоритм не підходить для складних і високографічних зображень.
Створіть вікторину