我有2个对象(我将它们称为目标和拦截器)。 我知道目标的当前位置和速度。 我知道拦截器的当前位置和速度。
由此,我现在需要知道的是:
即目标@(120,40),每秒V(5,2)和拦截器@(80,80),每秒可以以10的速度行进。
我环顾四周,找到了很多方法来找出他们遇到的点,他们都围绕两个向量之间的角度,因为我不知道第二个向量,我可以&#39 ; t计算出来并且我试图解决这个问题。
对任何有关如何进行的建议或指导表示赞赏。
答案 0 :(得分:6)
假设:
在时间0,目标位于A点,拦截器位于B点。在未来的某个时刻,它们将在C点相交。
线段 a 与A点相反,同样对于 b 和B, c 和C。
我们知道A和B的位置。我们可以从目标的标题中得出角度CAB。我们知道线段 a 和 b 的长度比等于(interceptor.speed / target.speed)。
首先,找到角度CAB
设矢量B ^等于目标的速度
设矢量C ^等于(interceptor.position.x - target.position.x,interceptor.position.y - target.position.y)。
使用点积公式确定它们之间的角度。
B dot C = ||B|| * ||C|| * cos(angle)
cos(angle) = (B dot C) / (||B|| * ||C||)
angle = arccos((B dot C) / (||B|| * ||C||))
......其中" dot"是dot product和|| B ||是矢量B的标量值。angle
是角度CAB。
现在我们找到角度ABC
使用law of sines,我们知道sin(ABC) / b == sin(CAB) / a
。
将等式重新排列为ABC = arcsin( sin(CAB) * (b/a) )
我们在最后一步找到了CAB,我们知道b / a是target.speed / interceptor.speed,所以将这些值插入并找到ABC。
现在您已经知道了两个角度和两个点,您应该能够得到C的位置。如果您使用度数,则角度ACB等于180 - (CAB + ABC),或者Pi - (CAB + ABC)如果您正在使用弧度。使用正弦定律确定边b和c的长度。现在,您可以使用T = b / target.speed
找到T,使用C = target.position + (target.velocity * T)
找到C.
我的C#有点生疏,所以here是一个示例Python实现。让我们插入您的样本值,结果是:
Collision pos: Point(163.065368246, 57.2261472985)
Time: 8.61307364926
Angle A: 113.198590514
Angle B: 29.6680851288
Angle C: 37.1333243575
a: 86.1307364926
b: 46.3828210973
c: 56.5685424949
位置和时间与gdir找到的位置和时间相同,所以我非常有信心我们的方法都有效。
编辑:MikeT:C#版
public static double Dot(Vector a, Vector b)
{
return a.X * b.X + a.Y * b.Y;
}
public static double Magnitude(Vector vec)
{
return Math.Sqrt(vec.X * vec.X + vec.Y * vec.Y);
}
public static double AngleBetween(Vector b, Vector c)
{
return Math.Acos(Dot(b, c) / (Magnitude(b) * Magnitude(c)));
}
public static Vector? Find_collision_point(Point target_pos, Vector target_vel, Point interceptor_pos, double interceptor_speed)
{
var k = Magnitude(target_vel) / interceptor_speed;
var distance_to_target = Magnitude(interceptor_pos - target_pos);
var b_hat = target_vel;
var c_hat = interceptor_pos - target_pos;
var CAB = AngleBetween(b_hat, c_hat);
var ABC = Math.Asin(Math.Sin(CAB) * k);
var ACB = (Math.PI) - (CAB + ABC);
var j = distance_to_target / Math.Sin(ACB);
var a = j * Math.Sin(CAB);
var b = j * Math.Sin(ABC);
var time_to_collision = b / Magnitude(target_vel);
var collision_pos = target_pos + (target_vel * time_to_collision);
return interceptor_pos - collision_pos;
}
答案 1 :(得分:6)
您可以使用2D矢量计算计算交点。目标沿着一条线移动。我们知道目标的起点,方向和速度。
在任何时间t> = 0时,目标位于由
定义的点x处
其中s_t是目标的起点(120,40),v_t是目标的速度矢量(5,2)。
我们知道拦截器的起点(s_i),它的速度(v_i),但不知道它的方向。我们可以用起点周围的圆来描述拦截器的范围,其半径随时间增加。在矢量微积分中我们得到
其中x是圆上的一个点,s_i是拦截器(80,80)的起点,r是拦截器在时间t的半径(或范围),v_i是拦截器的速度( 10)。
当目标和拦截器在时间t相遇时,它们的位置x必须相等。我们在圆方程的x中使用线方程的x并得到
对于t:
,这只是一个正常的quadratic equation
您可以轻松解决此问题。在这种情况下,您将获得有效且无效的解决方案:
t1 = -5.2328 =>无效,因为t必须是> = 0
t2 = 8.61307
现在您知道了,您可以使用第一个线方程计算交点。目标和拦截器在(163.065,57.223)见面