根据角度和速度计算交点
我有一个向量,它包含一个点、速度和方向。我们称这个向量为R。还有另一个向量,它只包含一个点和速度,没有方向。我们称这个向量为T。
现在,我想找到这两个向量的最短交点。因为T没有方向,这让事情变得有点复杂。我能够在CaRMetal中创建一个有效的公式,但在Python中却无法实现。
有人能建议一个更有效的方法来解决这个问题吗?或者帮我解决我现有的公式以找到X吗?
公式:
(来源: bja888.com)
关键:
(来源: bja888.com)
其中o或k是向量之间的速度差。R.speed / T.speed
4 个回答
- 假设第一个点A的速度是零。在这种情况下,找到一个方向让它最快与另一个点相交应该很简单。
- 现在,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' )
以上内容我还没测试过,但乍一看似乎合理……
在自然界中,猎手们使用一种叫做“恒定方位减少距离”的算法来捕捉猎物。我很喜欢关于蝙蝠如何做到这一点的解释,可以点击这里查看。
我们需要定义几个术语。
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的速度太快,就不存在交点了。
例如:
我的数学可能有点生疏,但试试这个方法:
p 和 q 是位置向量,d 和 e 是方向向量。经过时间 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)
最后一个是一个二次方程,你应该能自己解决这个问题 ;-)