使用什么算法来计算浮点半径的圆
What algorithm is used for computing a circle with floating point radius?
中点圆算法非常适合计算半径为整数的圆。
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
但是,当我尝试调整上面的算法以使用浮点运算(有或没有舍入)时,它会失去对称性并生成不连续的路径(导致一些非常奇怪的形状)。
有没有更适合我目的的算法?
如果你只对简单的分数(如 4/3 和 5/3)感兴趣,我会过采样(即使用子像素,这里每个像素 9 个子像素,因此计算半径为 4 和 5 子像素的圆),然后从子像素推断出像素的良好值。 如果您推断出不是开、关,那么您正在执行抗锯齿。
基本圆图...
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;
}
}
我认为
泰勒近似可能有用
- 使用一阶泰勒近似 (sqrt(u^2 + a) = u + a/2u) 计算 x^2= r^2- y^2 中的 x
相关文章:
- 编译器对数组声明大小的计算。什么时候发生?
- 计算 I+V[i++] 的顺序是什么?
- 在C++中使用 AKS 素数测试计算双胞胎素数 我做错了什么?
- "noexcept-expression 由于对......的调用而计算为'假'"是什么意思?
- 在 C++20 计算范围内相邻对的最简洁明了的方法是什么?
- 我的C++级数计算程序出了什么问题?被困了好几个星期
- 在 OpenGL 中计算矩阵时,转换的正确顺序是什么?
- 计算两个uint8_t变量之间差值的最快方法是什么?
- 什么是使用 opencv::Mat 优化 c++ 矩阵计算
- 当删除或删除[]被执行时,计算机会做什么?
- 对于我扩展此程序来计算最高10x10矩阵的倒数的最简单方法是什么
- MFC 用于计算控件的高光、阴影等的算法或函数是什么?
- 什么是计算C中PI的最有效方法
- 如何计算余数有什么区别吗?
- 此递归中发生了什么?我需要仅使用递归/无循环来计算和备份
- 谁可以帮助解释我的代码中出了什么问题.计算C ++中的数组
- 计算文本文件中行数的最佳条件是什么
- 计算每对向量的重复项的有效方法是什么?
- 我的逻辑有什么问题?尝试计算文件中包含特定字符的单词数
- 此表达式计算什么