logo

Bresenhemas apļa zīmēšanas algoritms

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:

  1. Viduspunkta apļa zīmēšanas algoritms
  2. 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' title=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).
 

aplis 2' loading='lazy' title=


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:  

  1. Iestatiet (xc yc) un (x y) sākotnējās vērtības.
  2. Iestatiet lēmuma parametru d uz d = 3 – (2 * r).
  3. Izsauciet funkciju drawCircle(int xc int yc int x int y).
  4. 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ība
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; } 

Izvade: 
 

aplis' loading='lazy' title=


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.
Izveidojiet viktorīnu