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:
- Középponti kör rajzolási algoritmusa
- 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
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).
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:
- Állítsa be az (xc yc) és (x y) kezdeti értékeit.
- Állítsa a d döntési paramétert d = 3 – (2 * r) értékre.
- Hívja meg a drawCircle(int xc int yc int x int y) függvényt.
- 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:

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.