我有一个由点,速度和方向组成的向量。我们将这个向量称为R.而另一个向量只包含一个点和一个速度。没有方向。我们称之为T. 现在,我要做的是找到这两个向量的最短交点。由于T没有方向,这被证明是困难的。我能够创建一个在CaRMetal中工作的公式,但我无法在python中使用它。 有人可以提出一种更有效的方法来解决这个问题吗?或者解决我现有的X公式?
公式:
(来源:bja888.com)
键:
(来源:bja888.com)
其中o或k是向量之间的速度差异。 R.speed / T.speed
答案 0 :(得分:1)
我的数学可能有点生疏,但试试这个:
p 和 q 是位置向量, d 和 e 是方向向量。在 t 之后,您希望它们位于同一个地方:
(1) p + t * d = q + t * e
由于你想要方向向量 e ,所以像这样写
(2) e =(p-q)/ t + d
现在您不需要时间 t ,您可以使用速度约束 s 计算(否则您可以直接前往另一个点):< / p>
方向向量 e 必须是 s 的长度,所以
(3) e 1 2 + e 2 2 = s 2
经过一些方程解决后,你最终得到了
(4)
I) a = sum(pq)/(s 2 -sum(d 2 ))
II) b = 2 * sum(d *(pq))/(s 2 -sum(d 2 ))
III) c = -1
IV) a + b * t + c * t 2 = 0
总和遍历你的矢量组件(2d中2个,3d中3个)
最后一个是你应该能够自己解决的二次公式; - )
答案 1 :(得分:0)
想到一个粗略的想法......
更多想法:
如果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移动,方向测试:
Vb_x'= Sb * cos(alpha)+ Sa * cos(beta)
Vb_y'= Sb * sin(alpha)+ Sa * sin(beta)
alpha'= atan2(Vb_y',Vb_x')
没有对上述内容进行测试,但乍看之下看起来很合理......
答案 2 :(得分:0)
在自然界中,猎人使用恒定的轴承减小范围算法捕捉猎物。 我喜欢蝙蝠如何做到这一点的解释link text
我们需要再定义一些术语。
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.x R.x + AB.y R.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太快,交叉点不存在
EG
答案 3 :(得分:-2)
好的,如果我理解你,你有
R = [xy0,v,r] T = [xy1,v]
如果你担心最短的交叉点,这将在你的位置相同时实现,并且在欧几里德空间中,这也会迫使第二个“东西”的方向垂直于第一个。你可以写下这个方程并轻松解决它们。