计算以不同速度移动的两个矢量的交叉点坐标

时间:2017-07-05 13:56:46

标签: javascript

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

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



enter image description here

我使用此功能来获取点之间的距离:

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个点的坐标,我知道红点将位于绿色点的坐标中。
绿点是静态的。

我该怎么办?

修改

澄清一下,这是同一问题的简单例子:

img

enter image description here

1 个答案:

答案 0 :(得分:1)

一种选择是缩小范围,直到你得到一个足够接近"答案。

首先弄清楚黄色到达红色所需的时间。在那个时候,Red当然会走向Green,但那没关系。

弄清楚如果Yellow已经离开红色的地方需要多长时间。

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

无论哪种方式,使用它来确定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