我基本上对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))
}
显然,真正的代码(查找表和预先计算的数量)有很多小优化,但这是它的本质。
干杯!