我想在一条直线上获得2个给定点之间的所有x,y,z坐标。我需要能够在JavaScript中执行此操作,以检查弹丸是否在我的游戏中发生碰撞。
例如,
点1:(0,0,0) 点2:(2,2,2) -> 0,0,0-1,1,1,2,2,2
编辑,这里是丢失者的有效代码。
def ROUND(a):
return int(a + 0.5)
def drawDDA(x1,y1,z1,x2,y2,z2):
x,y,z = x1,y1,z1
length = (x2-x1) if (x2-x1) > (y2-y1) else (y2-y1) if (y2-y1) > (z2-z1) else (z2-z1)
dx = (x2-x1)/float(length)
dy = (y2-y1)/float(length)
dz = (z2-z1)/float(length)
print (ROUND(x),ROUND(y),ROUND(z))
for i in range(length):
x += dx
z += dz
y += dy
print(ROUND(x),ROUND(y),ROUND(z))
drawDDA(0,1,2,10,11,12)
答案 0 :(得分:0)
您当前的方法将需要处理2D象限中的象限和3D情况中的八分象限,这很麻烦。如果改用 DDA (非常相似),您将摆脱它。所以:
P(t) = P0 + t*(P1-P0)
t=<0.0,1.0
这也称为线性插值。由于两个端点P(t)
之间有无限数量的点P0,P1
,我假设您只需要整数(代表PIXELS),因此您需要选择“ t
”,步长为“像素”或放下P(t)
的坐标。很简单:
dP = abs(P1-P0)
dt = 1.0/max(dP.x,dP.y,dP.z)
这称为行栅格化,也可以移植到整数算术,而无需浮点数。移植的版本如下所示:
dP = abs(P1-P0)
T = max(dP.x,dP.y,dP.z)
t = {0,1,2,...,T}
P(t) = P0 + (P1-P0)*t/T
甚至可以通过在循环内通过简单的条件增量/减量来交换*t/T
来改善这一点:
还有其他类似的算法,例如布雷森纳姆(Bresenham),但DDA在现代体系结构上速度更快,并且更容易扩展到任何维度。
答案 1 :(得分:0)
感谢所有帮助,我能够使用提到的DDA算法解决此问题。我将python版本放入我的问题中,如果其他人想要它,则将其更新为JavaScript。