当一个向量的方向未知时,两个向量之间的交点

Point of intersection between two vectors when the direction of one vector is not known

问题:我有两个向量。我知道一个矢量的起点、它的方向、它的大小。我知道另一个向量的起点及其大小。我需要找到第二个矢量的方向以及交点的位置。

   Vector A:                        Vector B:

Position = Known                   Position = Known  
Direction= Known                   Direction= UNKNOWN
Magnitude= Known                   Magnitude= Known

To Find: Point of intersection.

是否可以根据给定的参数找到交点?如果是那么怎么办?

应用:我想根据玩家的移动速度找到他会被发现的位置,并在他被发现的那一刻向他射击,同时考虑到子弹到达虚拟目标位置所需的时间。

让下标1标记玩家,下标2标记AI:

  • 初始:位置(x_i,y_i)
  • 角度:alpha_i
  • 速度:u_i

作为时间 t 函数的位置是:

  • 玩家:(x_1 + u_1 * t * cos(alpha_1), y_1 + u_1 * t * sin(alpha_1))
  • AI的子弹:(x_2 + u_2 * t * cos(alpha_2), y_2 + u_2 * t * sin(alpha_2))

你有 2 个未知数:

  • t - 碰撞时间
  • alpha_2 - AI 应该射击的角度

当Xs 和Ys 匹配时发生碰撞。即:

  • x_1 + u_1 * t * cos(alpha_1) = x_2 + u_2 * t * cos(alpha_2)
  • y_1 + u_1 * t * sin(alpha_1) = y_2 + u_2 * t * sin(alpha_2)

所以,

  • alpha_2 = arcos( (x_1 + u_1 * t * cos(alpha_1) - x_2) / u_2 * t)

还有

  • alpha_2 = arcsin( (y_1 + u_1 * t * sin(alpha_1) - y_2) / u_1 * t)

代入您的值并将这些值等同于 alpha_2 的表达式以获得 t,然后您可以在任一表达式中代入 t 以获得角度 alpha_2。

根据评论,我将在这里进行一次飞跃,直接回答您的最终问题。

假设玩家在初始时间在一个点 p 并且以速度 v 行进;你的枪在位置 q 并以 s:

的速度向 任意 方向发射子弹

OP的长度是vΔt,Q的长度是sΔt。角度 a 由点积给出:

然后我们可以使用余弦规则来求解Δt:

写成这种形式,我们很容易看出它是一个二次方程,因此直接用Quadratic formula:

求解Δt

这里我们需要考虑几种情况:

  • v < s: 只需要取正根,否则我们会得到负时间。
  • v > s and dot(PQ, s) < 0: 子弹永远打不到玩家。
  • v > sdot(PQ, s) > 0:这次取负根,因为正根是给一个向后移动的玩家(更长的时间;上图中也是这种情况)。

从上面得到 Δt 的正确值将使我们能够找到交点 o,从而找到预期的方向 d:

请注意 d 未标准化。此外,此解决方案 也适用于 3D,这与角度方法不同。