如何找到直线上两个给定点之间的坐标(JavaScript)?

时间:2018-10-10 07:30:27

标签: javascript 3d line rasterizing

我想在一条直线上获得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)

2 个答案:

答案 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。