Бресенхамов алгоритам за цртање круга
Није лако приказати непрекидан глатки лук на екрану рачунара јер је екран нашег рачунара направљен од пиксела организованих у матричном облику. Дакле, да бисмо нацртали круг на екрану рачунара, увек треба да изаберемо најближе пикселе од штампаног пиксела како би могли да формирају лук. Постоје два алгоритма за ово:
- Алгоритам за цртање круга у средини
- Бресенхамов алгоритам за цртање круга
Већ смо разговарали о Алгоритам за цртање круга у средини у нашем претходном посту. У овом посту ћемо разговарати о Бресенхамовом алгоритму за цртање круга.
Оба ова алгоритма користе кључну особину круга да је веома симетричан. Дакле, за целих 360 степени круга поделићемо га на 8 делова сваки октант од 45 степени. Да бисмо то урадили користићемо Бресенхамов алгоритам круга за израчунавање локација пиксела у првом октанту од 45 степени. Претпоставља се да је центар круга на почетку. Дакле, за сваки пиксел (к и) који израчунава цртамо пиксел у сваком од 8 октаната круга као што је приказано испод:
За пиксел (ки) сви могући пиксели у 8 октаната
Сада ћемо видети како израчунати локацију следећег пиксела из претходно познате локације пиксела (к и). У Бресенхамовом алгоритму у било којој тачки (к и) имамо две опције или да изаберемо следећи пиксел на истоку, тј. (к+1 и) или на југоистоку, тј. (к+1 и-1).
А ово се може одлучити коришћењем параметра одлуке д као:
- Ако је д > 0 онда (к+1 и-1) треба изабрати као следећи пиксел јер ће бити ближи луку.
- иначе (к+1 и) треба изабрати као следећи пиксел.
Сада да нацртамо круг за дати полупречник 'р' и центар (кц иц) Почећемо од (0 р) и кретати се у првом квадранту до к=и (тј. 45 степени). Требало би да почнемо од наведеног почетног услова:
d = 3 - (2 * r)
x = 0
y = rСада ћемо за сваки пиксел урадити следеће операције:
- Поставите почетне вредности (кц иц) и (к и).
- Поставите параметар одлуке д на д = 3 – (2 * р).
- Позовите функцију дравЦирцле(инт кц инт иц инт к инт и).
- Понављајте следеће кораке до к <= 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
Недостаци
- Постоји проблем са прецизношћу приликом генерисања поена.
- Овај алгоритам није погодан за сложене и високе графичке слике.