当一个向量的方向未知时,两个向量之间的交点
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 > s
和dot(PQ, s) > 0
:这次取负根,因为正根是给一个向后移动的玩家(更长的时间;上图中也是这种情况)。
从上面得到 Δt
的正确值将使我们能够找到交点 o
,从而找到预期的方向 d
:
请注意 d
未标准化。此外,此解决方案 也适用于 3D,这与角度方法不同。
问题:我有两个向量。我知道一个矢量的起点、它的方向、它的大小。我知道另一个向量的起点及其大小。我需要找到第二个矢量的方向以及交点的位置。
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
anddot(PQ, s) < 0
: 子弹永远打不到玩家。v > s
和dot(PQ, s) > 0
:这次取负根,因为正根是给一个向后移动的玩家(更长的时间;上图中也是这种情况)。
从上面得到 Δt
的正确值将使我们能够找到交点 o
,从而找到预期的方向 d
:
请注意 d
未标准化。此外,此解决方案 也适用于 3D,这与角度方法不同。