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

How can you find the coordinates between two given points on a straight line(JavaScript)?

我想获取直线上 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)

您当前的方法需要处理 2D 中的象限和 3D 中的八分圆,这很麻烦。如果您改用 DDA(这非常相似),您将摆脱它。所以:

P(t) = P0 + t*(P1-P0)
t=<0.0,1.0

这也称为线性插值。由于在你的两个端点 P0,P1 之间有无限数量的点 P(t) 我假设你只想要整数(代表 PIXELS)所以你需要 select t 与单个 "pixel" 对 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

甚至可以通过简单的条件 increment/decrement 内部循环交换 *t/T 来改善这一点,如下所示:

  • Precise subpixel line drawing algorithm (rasterization algorithm)

也有不同的算法,例如 Bresenham,但 DDA 在现代架构上速度更快,而且更简单且易于扩展到任何维度。

感谢大家的帮助,我使用提到的 DDA 算法解决了这个问题。我将 python 版本放在我的问题中,如果有人需要,我会将其更新为 JavaScript。