Datora ekrānā nav viegli attēlot nepārtrauktu gludu loku, jo mūsu datora ekrāns ir veidots no pikseļiem, kas sakārtoti matricas formā. Tātad, lai uz datora ekrāna uzzīmētu apli, mums vienmēr jāizvēlas tuvākie pikseļi no drukātā pikseļa, lai tie varētu veidot loku. Lai to izdarītu, ir divi algoritmi:
- Viduspunkta apļa zīmēšanas algoritms
- Bresenhemas apļa zīmēšanas algoritms
Mēs jau esam apsprieduši Viduspunkta apļa zīmēšanas algoritms mūsu iepriekšējā ierakstā.Šajā ierakstā mēs apspriedīsim Brezenhemas apļa zīmēšanas algoritmu.
string.substring java
Abi šie algoritmi izmanto apļa galveno iezīmi, ka tas ir ļoti simetrisks. Tātad veselam 360 grādu aplim mēs to sadalīsim 8 daļās, katra 45 grādu oktante. Lai to izdarītu, mēs izmantosim Bresenhema apļa algoritmu, lai aprēķinātu pikseļu atrašanās vietas pirmajā 45 grādu oktantā. Tas pieņem, ka aplis ir centrēts uz izcelsmi. Tātad katram pikselim (x y) tas tiek aprēķināts, mēs uzzīmējam pikseļu katrā no 8 apļa oktantiem, kā parādīts zemāk:
Pikselim (xy) visi iespējamie pikseļi 8 oktantos
Tagad mēs redzēsim, kā aprēķināt nākamo pikseļu atrašanās vietu no iepriekš zināmas pikseļa atrašanās vietas (x y). Bresenhema algoritmā jebkurā punktā (x y) mums ir divas iespējas vai nu izvēlēties nākamo pikseļu austrumos, t.i., (x+1 y) vai dienvidaustrumos, t.i. (x+1 y-1).
Un to var izlemt, izmantojot lēmuma parametru d kā:
- Ja d > 0, tad (x+1 y-1) ir jāizvēlas kā nākamais pikselis, jo tas būs tuvāk lokam.
- cits (x+1 y) ir jāizvēlas kā nākamais pikselis.
Tagad, lai uzzīmētu apli noteiktam rādiusam 'r' un centram (xc yc) Mēs sāksim no (0 r) un virzīsimies pirmajā kvadrantā līdz x=y (t.i., 45 grādi). Mums jāsāk no uzskaitītajiem sākuma nosacījumiem:
d = 3 - (2 * r)
x = 0
y = r
Tagad katram pikselim mēs veiksim šādas darbības:
- Iestatiet (xc yc) un (x y) sākotnējās vērtības.
- Iestatiet lēmuma parametru d uz d = 3 – (2 * r).
- Izsauciet funkciju drawCircle(int xc int yc int x int y).
- Atkārtojiet šīs darbības līdz x<= y:
- Ja d< 0 set d = d + (4 * x) + 6.
- Citādi iestatiet d = d + 4 * (x – y) + 10 un samaziniet y par 1.
- Palieliniet x vērtību.
- Izsauciet funkciju drawCircle(int xc int yc int x int y).
DrawCircle() funkcija:
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); }
Zemāk ir aprakstīta iepriekš minētās pieejas C ieviešana.
javafx apmācībaCPP
// 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; }
Izvade:

Priekšrocības
- Tas ir vienkāršs algoritms.
- To var viegli īstenot
- Tas ir pilnībā balstīts uz apļa vienādojumu, ti, x2+y2=r2
Trūkumi
- Punktu ģenerēšanas laikā rodas precizitātes problēma.
- Šis algoritms nav piemērots sarežģītiem un augstas grafiskiem attēliem.