midpoint circle algorithm非常适合计算圆,当它们的半径是整数时。
void CircleOptimized(int xc, int yc, int r, int color) {
unsigned int x= r, y= 0;//local coords
int cd2= 0; //current distance squared - radius squared
if (!r) return;
drawpixel(xc-r, yc, color);
drawpixel(xc+r, yc, color);
drawpixel(xc, yc-r, color);
drawpixel(xc, yc+r, color);
while (x > y) { //only formulate 1/8 of circle
cd2-= (--x) - (++y);
if (cd2 < 0) cd2+=x++;
drawpixel(xc-x, yc-y, color);//upper left left
drawpixel(xc-y, yc-x, color);//upper upper left
drawpixel(xc+y, yc-x, color);//upper upper right
drawpixel(xc+x, yc-y, color);//upper right right
drawpixel(xc-x, yc+y, color);//lower left left
drawpixel(xc-y, yc+x, color);//lower lower left
drawpixel(xc+y, yc+x, color);//lower lower right
drawpixel(xc+x, yc+y, color);//lower right right
}
}
例如,当传递r=1
和r=2
时,输出分别如下:
..... .XXX.
..X.. X...X
.X.X. X...X
..X.. X...X
..... .XXX.
r=1 r=2
但是,我需要在r=1
和r=2
之间再做几步。也许(假设)r=1.33
和r=1.66
可能看起来像这样:
..... ..... ..X.. .XXX.
..X.. .XXX. .X.X. X...X
.X.X. .X.X. X...X X...X
..X.. .XXX. .X.X. X...X
..... ..... ..X.. .XXX.
r=1.0 r=1.3 r=1.6 r=2.0
然而,当我尝试使用上面的算法来使用浮点运算(有或没有舍入)时,它会失去对称性并生成不连续的路径(导致一些非常奇怪的形状)。
我的目的是否有更合适的算法?
答案 0 :(得分:2)
如果您只对简单分数(如4/3和5/3)感兴趣,我会过采样(即使用子像素,这里每像素9个子像素,因此计算半径为4和5个子像素的圆)然后从子像素中推导出像素的良好值。如果你演绎的不是ON,那么你正在做抗锯齿。
答案 1 :(得分:0)
基本圆图...
public void DrawCircle(float stepSize, float radius, int colour)
{
float x, y;
float angle;
while (angle < 2*Math.PI)
{
x = radius * cos(angle);
y = radius * sin(angle);
// decide how to round your floating point X,Y here ...
drawpixel(x,y,colour);
angle += stepSize;
}
}
答案 2 :(得分:0)
我认为泰勒近似可能有用