在我的项目中,我需要实现圆形和椭圆光栅化(如果可能的话,用 C++ 或汇编 + SIMD)。我了解中点圆算法和布雷森纳姆圆算法。但这些算法使用整数值(中心 x、中心 y 和半径)。在我的例子中,半径和中心必须以浮点格式(或至少定点)表示。而且半径也可以小于 1px。所以我需要一个适用于浮点值的算法。有人可以帮助我吗?
我将为您提供圆的中点算法的基本介绍,但是您可以在大多数计算机图形学教科书中找到完整的中点算法。我假设中心和半径不是整数。从以圆为中心的隐式方程开始 在 (x_c,y_c) 处,半径为 R:
因此,给定平面上的任意点 (x,y),我们可以测试该点是否在圆内、圆上或圆外。我们首先仅在第一个八分圆中绘制圆的部分,其中 x - x_c < y_c - y. 在这种情况下,我们将始终在每次迭代中沿 x 方向步进一个像素。 我们将根据 (x+1,y) 和 (x+1,y+1) 之间的中点 m 的符号,在 y 方向上步进 0 或 1:
x = round(xc), y = round(yc - R); // top of circle, y-axis pts down
m = f(x+1,y + 0.5); // initial midpoint value
while x - cx < yc - y { // while in first octant
plot(x,y) // draw point at pixel grid point (x,y)
x = x + 1 // step in x by 1
if m < 0 // if midpoint inside circle
y = y + 1 // then increment y too
m = f(x,y) // update value at midpoint
}
剩下的主要技巧是
根据维基百科的Bresenham算法,认为在屏幕的像素中画一个圆圈。
这就是为什么你可以用浮点数来计算你的圆,将中心放在任何非整数的位置,任何非整数的半径,你的圆将被精确地绘制到整数像素的位置。