Ei ole helppoa näyttää jatkuvaa tasaista kaaria tietokoneen näytöllä, koska tietokoneemme näyttö koostuu matriisimuotoon järjestetyistä pikseleistä. Joten piirtääksemme ympyrän tietokoneen näytölle meidän tulee aina valita tulostetusta pikselistä lähimmät pikselit, jotta ne voisivat muodostaa kaaren. Tämän tekemiseen on kaksi algoritmia:
- Keskipisteen ympyrän piirustusalgoritmi
- Bresenhamin ympyrän piirustusalgoritmi
Olemme jo keskustelleet Keskipisteen ympyrän piirustusalgoritmi edellisessä viestissämme. Tässä viestissä keskustelemme Bresenhamin ympyrän piirustusalgoritmista.
java-merkkijono vertailuun
Molemmat algoritmit käyttävät ympyrän keskeistä ominaisuutta, että se on erittäin symmetrinen. Joten koko 360 asteen ympyrälle jaamme sen 8 osaan, jokainen 45 asteen oktantti. Tätä varten käytämme Bresenhamin ympyräalgoritmia 45 asteen ensimmäisen oktantin pikselien sijainnin laskemiseen. Se olettaa, että ympyrän keskipiste on origossa. Joten jokaiselle pikselille (x y) se laskee, piirrämme pikselin jokaiseen ympyrän kahdeksaan oktanttiin alla olevan kuvan mukaisesti:
Pikselille (xy) kaikki mahdolliset pikselit 8 oktantissa
Nyt näemme, kuinka lasketaan seuraava pikselin sijainti aiemmin tunnetusta pikselin sijainnista (x y). Bresenhamin algoritmissa meillä on missä tahansa kohdassa (x y) kaksi vaihtoehtoa joko valita seuraava pikseli idässä eli (x+1 y) tai kaakossa eli (x+1 y-1).
Ja tämä voidaan päättää käyttämällä päätösparametria d seuraavasti:
- Jos d > 0, niin (x+1 y-1) on valittava seuraavaksi pikseliksi, koska se on lähempänä kaaria.
- muuten (x+1 y) on valittava seuraavaksi pikseliksi.
Piirretään nyt ympyrä annetulle säteelle 'r' ja keskipisteelle (xc yc) Aloitamme kohdasta (0 r) ja siirrymme ensimmäisessä neljänneksessä x=y:ään (eli 45 astetta). Meidän tulee aloittaa luetelluista alkuehdoista:
d = 3 - (2 * r)
x = 0
y = r
Nyt jokaiselle pikselille teemme seuraavat toiminnot:
- Aseta alkuarvot (xc yc) ja (x y).
- Aseta päätösparametriksi d d = 3 – (2 * r).
- Kutsu funktio drawCircle(int xc int yc int x int y).
- Toista seuraavat vaiheet, kunnes x<= y:
- Jos d< 0 set d = d + (4 * x) + 6.
- Muutoin aseta d = d + 4 * (x – y) + 10 ja vähennä y:tä yhdellä.
- Kasvata x:n arvoa.
- Kutsu funktio drawCircle(int xc int yc int x int y).
drawCircle()-funktio:
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); }
Alla on yllä olevan lähestymistavan C-toteutus.
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; }
Lähtö:
lista menetelmistä java

Edut
- Se on yksinkertainen algoritmi.
- Se voidaan toteuttaa helposti
- Se perustuu täysin ympyrän yhtälöön eli x2+y2=r2
Haitat
- Pisteitä luotaessa on tarkkuusongelma.
- Tämä algoritmi ei sovellu monimutkaisille ja korkealaatuisille kuville.