Алгоритм малювання кола Брезенхема
Непросто відобразити безперервну плавну дугу на екрані комп’ютера, оскільки екран нашого комп’ютера складається з пікселів, організованих у формі матриці. Отже, щоб намалювати коло на екрані комп’ютера, ми завжди повинні вибирати найближчі пікселі з друкованого пікселя, щоб вони могли утворити дугу. Для цього є два алгоритми:
- Алгоритм малювання кола Mid-Point
- Алгоритм малювання кола Брезенхема
Ми вже обговорювали Алгоритм малювання кола Mid-Point у нашій попередній публікації. У цій публікації ми обговоримо алгоритм малювання кола Брезенхема.
Обидва ці алгоритми використовують ключову властивість кола — його високу симетричність. Таким чином, для цілих 360 градусів кола ми розділимо його на 8 частин, кожен октант 45 градусів. Для цього ми використаємо круговий алгоритм Брезенхема для розрахунку розташування пікселів у першому октанті 45 градусів. Він припускає, що коло має центр у початку координат. Отже, для кожного пікселя (x y), який він обчислює, ми малюємо піксель у кожному з 8 октантів кола, як показано нижче:
Для пікселя (xy) усі можливі пікселі у 8 октантах
Тепер ми побачимо, як обчислити розташування наступного пікселя з попередньо відомого розташування пікселя (x y). В алгоритмі Брезенхема в будь-якій точці (x y) ми маємо два варіанти: вибрати наступний піксель на сході, тобто (x+1 y), або на південному сході, тобто (x+1 y-1).
І це можна вирішити за допомогою параметра рішення 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Тепер для кожного пікселя ми виконаємо такі операції:
- Установіть початкові значення (xc yc) і (x y).
- Встановіть параметр рішення d на d = 3 – (2 * r).
- Викличте функцію drawCircle(int xc int yc int x int y).
- Повторюйте наступні дії до 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
Недоліки
- Існує проблема точності під час генерування очок.
- Цей алгоритм не підходить для складних і високографічних зображень.