Kompiuterio ekrane nėra lengva rodyti nuolatinį sklandų lanką, nes mūsų kompiuterio ekranas sudarytas iš pikselių, išdėstytų matricos pavidalu. Taigi, norėdami nubrėžti apskritimą kompiuterio ekrane, visada turėtume pasirinkti artimiausius pikselius iš atspausdinto pikselio, kad jie sudarytų lanką. Tam yra du algoritmai:
- Vidurio taško apskritimo piešimo algoritmas
- Bresenhamo apskritimo piešimo algoritmas
Mes jau aptarėme Vidurio taško apskritimo piešimo algoritmas ankstesniame mūsų įraše.Šiame įraše aptarsime Bresenhamo apskritimo piešimo algoritmą.
.lygu java
Abu šie algoritmai naudoja pagrindinę apskritimo savybę, kad jis yra labai simetriškas. Taigi visą 360 laipsnių apskritimą padalinsime į 8 dalis, kurių kiekviena yra 45 laipsnių oktantas. Norėdami tai padaryti, mes naudosime Bresenhamo apskritimo algoritmą pikselių vietoms apskaičiuoti pirmajame 45 laipsnių oktante. Daroma prielaida, kad apskritimo centras yra pradiniame taške. Taigi kiekvienam pikseliui (x y) jis apskaičiuojamas, mes nubrėžiame po pikselį kiekviename iš 8 apskritimo oktantų, kaip parodyta žemiau:
Pikseliui (xy) visi galimi pikseliai 8 oktantais
Dabar pamatysime, kaip apskaičiuoti kitą pikselio vietą iš anksčiau žinomos pikselio vietos (x y). Bresenhamo algoritme bet kuriame taške (x y) turime dvi parinktis arba pasirinkti kitą pikselį rytuose, t. y. (x+1 y) arba pietryčiuose, t. y. (x+1 y-1).
Ir tai galima nuspręsti naudojant sprendimo parametrą d kaip:
- Jei d > 0, tada (x+1 y-1) reikia pasirinkti kaip kitą pikselį, nes jis bus arčiau lanko.
- kitaip (x+1 y) turi būti pasirinktas kaip kitas pikselis.
Dabar, norėdami nubrėžti apskritimą tam tikram spinduliui 'r' ir centrui (xc yc) Pradėsime nuo (0 r) ir judėsime pirmajame kvadrante iki x=y (ty 45 laipsniai). Turėtume pradėti nuo išvardytos pradinės sąlygos:
d = 3 - (2 * r)
x = 0
y = r
Dabar kiekvienam pikseliui atliksime šias operacijas:
- Nustatykite pradines (xc yc) ir (x y) reikšmes.
- Nustatykite sprendimo parametrą d į d = 3 – (2 * r).
- Iškvieskite funkciją drawCircle(int xc int yc int x int y).
- Kartokite šiuos veiksmus iki x<= y:
- Jei d< 0 set d = d + (4 * x) + 6.
- Kitu atveju nustatykite d = d + 4 * (x – y) + 10 ir sumažinkite y 1.
- Padidinkite x reikšmę.
- Iškvieskite funkciją drawCircle(int xc int yc int x int y).
DrawCircle() funkcija:
rasti eilutėje c++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); }
Žemiau pateiktas aukščiau pateikto požiūrio C įgyvendinimas.
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; }
Išvestis:

Privalumai
- Tai paprastas algoritmas.
- Jį galima nesunkiai įgyvendinti
- Jis visiškai pagrįstas apskritimo lygtimi, ty x2+y2=r2
Trūkumai
- Generuojant taškus kyla tikslumo problema.
- Šis algoritmas netinka sudėtingiems ir grafiškiems vaizdams.