logo

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

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

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

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

стеки Java

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



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


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

коло 2' loading='lazy' title=


І це можна вирішити за допомогою параметра рішення 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; } 

Вихід: 
 

java string concat

закруглення' loading='lazy' title=


Переваги  

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

Недоліки  

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