根据角度和速度计算交点

3 投票
4 回答
2527 浏览
提问于 2025-04-15 16:38

我有一个向量,它包含一个点、速度和方向。我们称这个向量为R。还有另一个向量,它只包含一个点和速度,没有方向。我们称这个向量为T。

现在,我想找到这两个向量的最短交点。因为T没有方向,这让事情变得有点复杂。我能够在CaRMetal中创建一个有效的公式,但在Python中却无法实现。

有人能建议一个更有效的方法来解决这个问题吗?或者帮我解决我现有的公式以找到X吗?

公式:

公式
(来源: bja888.com)

关键:

定义
(来源: bja888.com)

其中o或k是向量之间的速度差。R.speed / T.speed

4 个回答

0
  1. 假设第一个点A的速度是零。在这种情况下,找到一个方向让它最快与另一个点相交应该很简单。
  2. 现在,A有速度了。我们可以通过从B的速度向量中减去A的速度向量,强制让A的速度变为零。这样我们就可以像第一步那样来解决问题。

这只是我脑海中浮现的一个粗略想法……

再多想想:

如果A静止不动,那么B需要朝A的方向移动。这就给了我们一个在A静止时的坐标系统中的方向,我们称之为d。

现在我们只需要把B需要移动的方向,从A静止的坐标系统转换到A以给定速度和方向移动的坐标系统,称之为d2。

这其实就是向量相加。d3 = d - d2。我们现在可以找到d3的方向。

再正式一点:

A是静止的

Sb = B的速度,已知的标量

alpha = atan2( a_y-b_y, a_x-b_x )

Vb_x = Sb * cos(alpha)

Vb_y = Sb * sin(alpha)

A以速度Sa,方向beta移动

Vb_x' = Sb * cos(alpha) + Sa * cos(beta)

Vb_y' = Sb * sin(alpha) + Sa * sin(beta)

alpha' = atan2( Vb_y', Vb_x' )

以上内容我还没测试过,但乍一看似乎合理……

0

在自然界中,猎手们使用一种叫做“恒定方位减少距离”的算法来捕捉猎物。我很喜欢关于蝙蝠如何做到这一点的解释,可以点击这里查看

我们需要定义几个术语。

Point A         - the position associated with vector R.
Point B         - the position associated with vector T.
Vector AB    - the vector from point A to point B
Angle beta  - the angle between vector R and vector AB.
Angle theta - the angle between vector T and vector AB

这个公式通常是这样表示的:

theta = asin( |R| * sin(beta) / |T| )

其中

beta = acos( AB.xR.x + AB.yR.y )

你不想直接使用这个公式,因为asin和acos函数只会返回-PI/2到PI/2之间的角度。

beta  = atan2( R.y, R.x  ) - atan2( AB.y, AB.x )
x        = |R| * sin(beta) / |T|
y        = 1 + sqrt( 1 - x*x )
theta = 2*atan2( y, x )

当然,如果x > 1,R的速度太快,就不存在交点了。

例如:

1

我的数学可能有点生疏,但试试这个方法:

pq 是位置向量,de 是方向向量。经过时间 t 后,你希望它们在同一个地方:

(1) p+t*d = q+t*e

因为你想要方向向量 e,可以这样写:

(2) e = (p-q)/t + d

现在你不需要时间 t,可以用你的速度限制 s 来计算(否则你可以直接到达另一个点):

方向向量 e 的长度必须是 s,所以:

(3) e12 + e22 = s2

经过一些方程的求解,你会得到:

(4)

I) a = sum(p-q)/(s2-sum(d2))

II) b = 2*sum(d*(p-q))/(s2-sum(d2))

III) c = -1

IV) a + b*t + c*t2 = 0

这里的 sum 是对你的向量分量求和(在二维中是2,在三维中是3)

最后一个是一个二次方程,你应该能自己解决这个问题 ;-)

撰写回答