logo

Bresenham körrajzi algoritmusa

Nem könnyű folyamatos sima ívet megjeleníteni a számítógép képernyőjén, mivel számítógépünk képernyője mátrix formájú képpontokból áll. Ha tehát kört szeretnénk rajzolni a számítógép képernyőjén, mindig a nyomtatott képpontok közül kell kiválasztani a legközelebbi képpontokat, hogy ívet alkossanak. Két algoritmus létezik erre:

  1. Középponti kör rajzolási algoritmusa
  2. Bresenham körrajzi algoritmusa

Már megbeszéltük a Középponti kör rajzolási algoritmusa előző bejegyzésünkben.Ebben a bejegyzésben a Bresenham-féle körrajzi algoritmusról lesz szó. 

karakterlánc a char java-hoz

Mindkét algoritmus a kör kulcsfontosságú jellemzőjét használja, hogy erősen szimmetrikus. Tehát a teljes 360 fokos körre 8 részre osztjuk, minden 45 fokos oktánsra. Ennek érdekében Bresenham kör algoritmusát használjuk a pixelek elhelyezkedésének kiszámításához a 45 fok első oktánsában. Feltételezi, hogy a kör középpontjában az origó áll. Tehát minden pixelhez (x y) rajzolunk egy-egy pixelt a kör 8 oktánsába az alábbiak szerint: 



Egy pixelnél (xy) az összes lehetséges pixel 8 oktánsban' title=Egy pixelnél (xy) az összes lehetséges pixel 8 oktánsban


Most látni fogjuk, hogyan kell kiszámítani a következő pixel helyét egy korábban ismert pixelhelyről (x y). A Bresenham-algoritmusban bármely ponton (x y) két lehetőségünk van a következő képpont kiválasztására keleten, azaz (x+1 y), vagy délkeleten, azaz (x+1 y-1).
 

kör 2' loading='lazy' title=


Ezt pedig a d döntési paraméter használatával lehet eldönteni: 
 

  • Ha d > 0, akkor (x+1 y-1) kell a következő pixelnek választani, mert az közelebb lesz az ívhez.
  • különben (x+1 y) a következő pixel.


Most, hogy megrajzoljuk a kört egy adott 'r' sugárra és középpontra (xc yc) Kezdjük (0 r) és az első kvadránsban haladunk x=y-ig (azaz 45 fokig). A felsorolt ​​kezdeti feltételekből kell kiindulnunk: 
 

d = 3 - (2 * r)  
x = 0
y = r

Most minden pixelnél a következő műveleteket hajtjuk végre:  

  1. Állítsa be az (xc yc) és (x y) kezdeti értékeit.
  2. Állítsa a d döntési paramétert d = 3 – (2 * r) értékre.
  3. Hívja meg a drawCircle(int xc int yc int x int y) függvényt.
  4. Ismételje meg a következő lépéseket x-ig<= y:
    • Ha d< 0 set d = d + (4 * x) + 6.
    • Ellenkező esetben állítsa be a d = d + 4 * (x – y) + 10 értéket, és csökkentse y-t 1-gyel.
    • Növelje x értékét.
    • Hívja meg a drawCircle(int xc int yc int x int y) függvényt.

drawCircle() függvény:  

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); } 

Alább látható a fenti megközelítés C megvalósítása. 

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; } 

Kimenet: 
 

körözés' loading='lazy' title=


Előnyök  

tömblista módszerek
  • Ez egy egyszerű algoritmus.
  • Könnyen megvalósítható
  • Teljesen a kör egyenletén, azaz x-en alapul2+y2=r2

Hátrányok  

  • Pontossági probléma van a pontok generálásakor.
  • Ez az algoritmus nem alkalmas összetett és magas grafikus képekhez.
Kvíz létrehozása