计算拦截向量

时间:2015-04-28 12:12:41

标签: c# math vector

我有2个对象(我将它们称为目标拦截器)。 我知道目标的当前位置和速度。 我知道拦截器的当前位置和速度。

由此,我现在需要知道的是:

  • 是否可以拦截,即同一时间点的相同位置。
  • 拦截器需要传递什么载体
  • 拦截需要多长时间

即目标@(120,40),每秒V(5,2)和拦截器@(80,80),每秒可以以10的速度行进。

我环顾四周,找到了很多方法来找出他们遇到的点,他们都围绕两个向量之间的角度,因为我不知道第二个向量,我可以&#39 ; t计算出来并且我试图解决这个问题。

对任何有关如何进行的建议或指导表示赞赏。

2 个答案:

答案 0 :(得分:6)

假设:

在时间0,目标位于A点,拦截器位于B点。在未来的某个时刻,它们将在C点相交。

线段 a 与A点相反,同样对于 b 和B, c 和C。

enter image description here

我们知道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处

enter image description here

其中s_t是目标的起点(120,40),v_t是目标的速度矢量(5,2)。

我们知道拦截器的起点(s_i),它的速度(v_i),但不知道它的方向。我们可以用起点周围的圆来描述拦截器的范围,其半径随时间增加。在矢量微积分中我们得到

enter image description here

其中x是圆上的一个点,s_i是拦截器(80,80)的起点,r是拦截器在时间t的半径(或范围),v_i是拦截器的速度( 10)。

当目标和拦截器在时间t相遇时,它们的位置x必须相等。我们在圆方程的x中使用线方程的x并得到

enter image description here

对于t:

,这只是一个正常的quadratic equation

enter image description here

您可以轻松解决此问题。在这种情况下,您将获得有效且无效的解决方案:

t1 = -5.2328 =>无效,因为t必须是> = 0

t2 = 8.61307

现在您知道了,您可以使用第一个线方程计算交点。目标和拦截器在(163.065,57.223)见面