我基本上对 Bresenham 的圆图的推论感到好奇,但在 3D 透视图中,最终结果是Y
(垂直)平面上的平面圆。有没有一种神奇的 DDA 类型算法来处理这类事情?
请注意,DDA的意思是主要使用整数并避免尽可能多的乘法和除法,因为主要瓶颈是透视Z
除法。
到目前为止,我想出的是以一些增量循环 360 度,并根据增量在投影坐标和下一个坐标之间画一条线。下图是使用 23 度增量的测试(我会使用 22.5,但这适用于整数查找,只有整数度精度):
伪代码类似于:
for (degree = 0; degree < 360; degree += degree_inc) {
z1 = z + radius * cos(degree)
x1 = x + radius * sin(degree)
y1 = y
next_degree = degree + degree_inc
if (next_degree >= 360) {
next_degree = 0;
}
z2 = z + radius * cos(next_degree)
x2 = x + radius * sin(next_degree)
y2 = y
line(project_x(x1,z1), project_y(y1,z1),
project_x(x2,z2), project_y(y2,z2))
}
显然,对实际代码(查找表和预先计算的数量)有很多小的优化,但这就是它的本质。
干杯!