Det er ikke nemt at vise en kontinuerlig glat bue på computerskærmen, da vores computerskærm er lavet af pixels organiseret i matrixform. Så for at tegne en cirkel på en computerskærm bør vi altid vælge de nærmeste pixels fra en printet pixel, så de kunne danne en bue. Der er to algoritmer til at gøre dette:
- Algoritme til tegning af midtpunktscirkler
- Bresenhams cirkeltegningsalgoritme
Vi har allerede diskuteret Algoritme til tegning af midtpunktscirkler i vores tidligere indlæg.I dette indlæg vil vi diskutere om Bresenhams cirkeltegningsalgoritme.
sammenligne i streng
Begge disse algoritmer bruger nøgleegenskaben ved cirkel, at den er meget symmetrisk. Så for hele 360 graders cirkel vil vi dele den i 8 dele hver oktant på 45 grader. For at gøre det vil vi bruge Bresenhams Circle Algorithm til at beregne placeringen af pixels i den første oktant på 45 grader. Det antager, at cirklen er centreret om oprindelsen. Så for hver pixel (x y) beregner den, at vi tegner en pixel i hver af de 8 oktanter i cirklen som vist nedenfor:
For en pixel (xy) alle mulige pixels i 8 oktanter
Nu vil vi se, hvordan man beregner den næste pixelplacering fra en tidligere kendt pixelplacering (x y). I Bresenhams algoritme på et hvilket som helst punkt (x y) har vi to muligheder enten at vælge den næste pixel i øst, dvs. (x+1 y) eller i sydøst, dvs. (x+1 y-1).
Og dette kan afgøres ved at bruge beslutningsparameteren d som:
- Hvis d > 0 skal (x+1 y-1) vælges som næste pixel, da den vil være tættere på buen.
- andet (x+1 y) skal vælges som næste pixel.
Nu for at tegne cirklen for en given radius 'r' og centrum (xc yc) Vi starter fra (0 r) og bevæger os i første kvadrant indtil x=y (dvs. 45 grader). Vi bør starte fra den angivne starttilstand:
d = 3 - (2 * r)
x = 0
y = r
For hver pixel vil vi nu udføre følgende handlinger:
- Indstil startværdier for (xc yc) og (x y).
- Indstil beslutningsparameteren d til d = 3 – (2 * r).
- Kald funktionen drawCircle(int xc int yc int x int y).
- Gentag følgende trin indtil x<= y:
- Hvis d< 0 set d = d + (4 * x) + 6.
- Ellers sæt d = d + 4 * (x – y) + 10 og formindsk y med 1.
- Forøg værdien af x.
- Kald funktionen drawCircle(int xc int yc int x int y).
drawCircle() funktion:
hvordan man konverterer char til string javaCPP
// 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); }
Nedenfor er C implementering af ovenstående tilgang.
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; }
Produktion:

Fordele
- Det er en simpel algoritme.
- Det kan nemt implementeres
- Det er fuldstændig baseret på cirkelligningen, dvs. x2+y2=r2
Ulemper
- Der er et problem med nøjagtighed under generering af point.
- Denne algoritme er ikke egnet til komplekse og høje grafiske billeder.