Bresenham körrajzi algoritmusa

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ó. 

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ánsbanEgy 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


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


Előnyök  

  • Ez egy egyszerű algoritmus.
  • Könnyen megvalósítható
  • Teljesen a kör egyenletén, azaz x-en alapul 2 +y 2 =r 2

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