【问题标题】:Compute intersection coordinates of two vectors moving on different speeds计算以不同速度移动的两个向量的交点坐标
【发布时间】:2017-07-05 23:56:54
【问题描述】:

红点正以 400 的速度向绿点方向移动。
在黄点到达该位置所需的时间后,我想将黄点移动到红点的坐标。

换句话说,我希望黄点在红点到达绿点坐标之前拦截红点,使它们重叠。





我正在使用这个函数来获取点之间的距离:

function getDistance(a, b) {
    return Math.sqrt(Math.pow(a.x - b.x, 2) + Math.pow(a.y - b.y, 2));
}

这是一个考虑到速度的标准化距离:

function normalizeDistance(distance, speed) {
    return distance / speed;
}

但我不知道如何获取我需要的信息。

我在逻辑上知道 3 个点的坐标,并且我知道红点将指向绿色点的坐标。
绿点是静态的。

我该怎么办?

编辑

为了澄清,这里有同样问题的更简单的例子:


【问题讨论】:

  • 这很难。在您的示例中,黄点到达红点所需的时间越长,红点将行进越远,并且由于它模糊地朝向黄点,黄点到达那里所需的时间就越少。考虑三个点完全对齐(黄色、绿色、红色)的场景,会发生什么?
  • 如果 3 个点完全对齐,我认为应该更容易吧?无需考虑轨迹。 i.imgur.com/pAvbJFk.png
  • 我建议你先在math.stackexchange.com 上问这个问题,如果那里有一个好的解决方案,请提供关于如何以匹配方式执行此操作的其他数据的赏金...
  • 谢谢你,我会做的!
  • 我在这里为任何感兴趣的人发布了这个问题:math.stackexchange.com/questions/2347345/…

标签: javascript


【解决方案1】:

一种选择是缩小范围,直到得到“足够接近”的答案。

首先计算黄色到达红色所在的位置需要多长时间。到那时,Red 当然会向 Green 移动,但这没关系。

算出如果黄色到达红色的终点需要多长时间。

这可能更长(如果红色通常远离黄色)或可能更短(如果红色通常向黄色移动)。

无论哪种方式,都可以使用它来确定 Red 的最终目标并获得新目标。继续朝着新目标调整,直到你“足够接近”红色,这是可以接受的。

Demo 具有可用的配置选项

大致思路是(伪代码):

epsilon = 0.01
red_angle = Math.atan2(green.y - red.y, green.x - red.x)

target = {x:red.x, y:red.y}
distance = pythagoras(target.x - yellow.x, target.y - yellow.y)
time = distance / yellow.speed
redmoved = time * red.speed
newtarget = {
  x: red.x + redmoved * Math.cos(red_angle),
  y: red.y + redmoved * Math.sin(red_angle)
}
delta = pythagoras(target.x - newtarget.x, target.y - newtarget.y)
// repeat while delta > epsilon or after a reasonable maximum number of steps

【讨论】:

  • 酷!您的演示需要花费大量时间来“猜测”正确的位置。这是否与您添加以减慢查看过程的速度有关,还是真的那么慢?
  • 它使用 setTimeout(iterate, 1000) 在猜测之间设置 1 秒的间隔,以进行可视化。
  • 对!这是完美的(我猜?)
  • 我不知道它是否完美,这取决于您在您的应用程序中尝试该算法,看看它是否适合您;)值得注意的是,“最大步数”很重要,因为如果黄色不能赶上红色(例如,红色以某种方式超过黄色),那么放弃需要有一个合理的限制。
  • 其实我打算用它来改进我的僵尸杀手“AI”here。您可能也想尝试一下?
猜你喜欢
  • 2021-08-04
  • 1970-01-01
  • 2015-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多