【发布时间】:2015-03-21 07:17:43
【问题描述】:
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
但是,当我尝试调整上述算法以使用浮点运算(带或不带舍入)时,它会失去对称性并生成不连续的路径(导致一些非常奇怪的形状)。
有没有更适合我的算法?
【问题讨论】:
-
那么,您在问为什么您没有显示的代码版本不起作用?看到这里有什么问题吗? ;-)
-
无论如何,整个算法都是基于整数运算的。要么使用带有缩放比例的整数,要么使用基本的 sin 和 cos 公式来计算圆。
-
@hyde 复制并粘贴代码块似乎非常简单,只需将
int替换为float,然后再复制并粘贴一个添加的round。 -
@hyde 或者您可以使用圆方程,
x^2 + y^2 = r^2。它允许您非常轻松地进行提示(基于等式左侧和右侧之间的差异),并且如果半径相对较低(您似乎正在使用非常小的圆圈),它应该非常快(注意你只需要为四分之一的圆圈做这个 - 其他三个是简单的镜子)。无论如何,您为什么要关心优化圆形绘图?你想解决什么问题? -
一种方法是硬编码少数特殊情况,例如 1.3、1.6、2.5。然后使用整数算法其余的。也就是说,如果您不想/不需要抗锯齿,并且不需要更多特殊情况。