你如何找到直线上两个给定点之间的坐标(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。
我想获取直线上 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。