Bresenham est loin d'être optimale ces jours-ci ... ce A propos de l'exploitation de l'équation du cercle:
(x-x0)^2 + (x-y0)^2 = r^2
nous allons:
x0,y0 - center
r1 - outer radius
r2 - inner radius
r1<=r2
xs,ys - screen resolution
scr[ys][xy] - screen matrix
dans C++ il ressemble à ceci:
int x,y,xx,yy,rr,rr1=r1*r1,rr2=r2*r2;
for (y=y0-r1;y<=y0+r1;y++) // loop all y positions
if ((y>=0)&&(y<ys)) // clip to screen
for (yy=y-y0,yy*=yy,x=x0-r1;x<=x0+r1;x++) // loop all x positions
if ((x>=0)&&(x<xs)) // clip to screen
{
xx=x-x0; xx*=xx; rr=xx+yy;
if ((rr>=rr2)&&(rr<=rr1)) // is in between radiuses?
scr[y][x]=fill_color;
}
Vous pouvez vous débarrasser de l'écran écrêtage if
déclarations facilement limites pré-calcul pour les deux boucles qui sont à l'intérieur de l'écran ...
Pour les cercles remplis cette approche est généralement plus rapide alors Bresenham pour ne pas mentionner facilement parallélisable.