【问题标题】:How can you find the coordinates between two given points on a straight line(JavaScript)?你怎么能找到直线上两个给定点之间的坐标(JavaScript)?
【发布时间】:2018-10-10 07:30:27
【问题描述】:

我想在一条直线上获取 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 个不同的点之间有无限多的点。

标签: javascript 3d line rasterizing


【解决方案1】:

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

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

这也称为线性插值。由于在两个端点 P0,P1 之间有无限数量的点 P(t) 我假设您只想要整数点(代表 PIXELS),因此您需要选择 t 与单个“像素”步长并舍入或降低 @ 的坐标987654327@。很简单:

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 在现代架构上速度更快,而且更简单且可轻松扩展到任何维度。

【讨论】:

  • 我找到了一些演示代码,有什么想法可以将其转换为 JavaScript 吗?
  • @YangYing 代码看起来与整数数学上的 3D DDA 完全一样,没有我所写的除法。我不使用 JavaScript 编写代码,但我敢打赌,您需要更改标头以匹配 JavaScript 语法,并将setPixel(x0,y0,z0); 与您的环境用于像素渲染的函数交换......我怀疑有些东西是虱子Canvas-&gt;Pixels[x][y]。此外,您不能在 2D 屏幕上渲染 3D 像素,因此您需要忽略 z 坐标或添加某种投影......除非您要渲染成体积数据。
【解决方案2】:

感谢所有帮助,我能够使用提到的 DDA 算法解决此问题。我将 python 版本放在我的问题中,如果其他人想要它,我会将它更新为 JavaScript。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    相关资源
    最近更新 更多