这个问题直到现在我都无法解决,虽然我已经阅读了几篇文章 - 希望有人可以在这里帮忙。
事实(知道变量):
现在我想计算与另一个移动物体相交(撞击)所需的第二个移动物体的方向(角度)。
由于物体之间的距离很小(仅在5-20公里的范围内)并且不需要非常高的精度,因此可以将地球表面视为平面。
因此我已经尝试过使用这个很棒的库: http://www.codeproject.com/Articles/990452/Interception-of-Two-Moving-Objects-in-D-Space
但我真的没办法工作,因为我不知道如何将m / s的速度来回转换为纬度/经度速度矢量。
为了更好地理解这里的问题,请使用值示例:
对此提出任何帮助都将受到高度赞赏,提前谢谢!
答案 0 :(得分:4)
如果距离很小,您可以按照建议将纬度/经度坐标转换为平面上的x,y坐标,例如使用this question的答案,那么解决这个问题所需的数学就非常简单。
下图显示了追踪器和目标在时间0(红色和蓝色点)的位置,它们的速度(圆圈显示它们在时间1,2,3 ......后的范围)和目标的轨迹(蓝色)射线)。
绿色曲线包含目标和追逐者可能在同一时刻保持当前速度移动的所有位置。该曲线与目标轨迹的交点是截取点(粉红点)。
如果拦截发生在时间 t 之后,则追踪者和目标行进的距离为 tv c 和 tv 吨子> 的。我们还知道在时间0处追踪者和目标之间的距离 d ,以及连接追踪者和目标的线段与目标的轨迹之间的角度α。如果我们将这些输入cosine rule,我们会得到:
(t.v c ) 2 =(t。v t ) 2 + d 2 - 2。 d。 t。 v t 。 cos(α)
当我们解决时间 t 时会转换为此quadratic equation:
(v c 2 - v t 2 )。 t 2 +(2.d.v t .cos(α))。 t - d 2 = 0
如果我们使用quadratic formula解决此问题:
t =( - b±√(b 2 - 4.a.c))/(2.a)
其中:
a = v c 2 - v t 2
b = 2。 d。 v t 。 COS(α)
c = - d 2
非负discriminant表示拦截是可能的,并且通过在二次公式中使用加法获得的根是拦截的第一个或唯一的时间。
正如您在上图所示,如果追踪者比目标慢,如果目标向追踪者移动(蓝色光线与绿色曲线相交),则可能有两个拦截点,但如果目标移开则没有来自追逐者。在二次公式中使用加法给出第一个截取点(使用减法将给出第二个截取点)。
然后,我们可以在时间 t (即截取点)和从追踪者到此点的方向之后计算目标的位置。
下面的JavaScript代码段演示了此方法,其中包含两个图像的值。它使用标准JavaScript方向的弧度角度(0 =右,π/ 2 =向上,π=向左,-π/ 2 =向下)。使用isosceles triangle theorem求解追踪器和目标具有相等速度(并且曲线是直线)的情况,否则它将导致二次方程中除以零。
function intercept(chaser, target) {
var dist = distance(chaser, target);
var dir = direction(chaser, target);
var angle = Math.PI + dir - target.dir;
// EQUAL VELOCITY CASE: SOLVE BY ISOSCELES TRIANGLE THEOREM
if (chaser.vel == target.vel) {
if (Math.cos(angle) < 0) return undefined; // INTERCEPTION IMPOSSIBLE
return (dir + angle) % (Math.PI * 2);
}
// GENERAL CASE: SOLVE BY COSINE RULE AND QUADRATIC EQUATION
var a = Math.pow(chaser.vel, 2) - Math.pow(target.vel, 2);
var b = 2 * dist * target.vel * Math.cos(angle);
var c = -Math.pow(dist, 2);
var disc = Math.pow(b, 2) - 4 * a * c;
if (disc < 0) return undefined; // INTERCEPTION IMPOSSIBLE
var time = (Math.sqrt(disc) - b) / (2 * a);
var x = target.x + target.vel * time * Math.cos(target.dir);
var y = target.y + target.vel * time * Math.sin(target.dir);
return direction(chaser, {x: x, y: y});
function distance(p, q) {
return Math.sqrt(Math.pow(p.x - q.x, 2) + Math.pow(p.y - q.y, 2));
}
function direction(p, q) {
return Math.atan2(q.y - p.y, q.x - p.x);
}
}
var chaser = {x: 196, y: -45, vel: 100};
var target = {x: 139, y: -312, vel: 75, dir: 0.1815142422};
document.write(intercept(chaser, target) + "<br>");// -1.015 radians = -58.17 degrees
var chaser = {x: 369, y: -235, vel: 37.5};
var target = {x: 139, y: -376, vel: 75, dir: 0.1815142422};
document.write(intercept(chaser, target) + "<br>");// -1.787 radians = -102.4 degrees
其他拦截点
绿色曲线有效地将2D平面划分为目标将首先到达的区域,以及追踪器将首先到达的区域。如果你想让追击者和目标以恒定的速度移动并发生碰撞(想象一下,例如在一艘移动的船上发射鱼雷)那么你就会瞄准曲线上的一个点,两个点将在同一时间到达,如同如上所述。
然而,如果追逐者可以到达某个点然后等待目标到达(想象一下,例如一个人试图赶上一辆公共汽车),那么目标在“追踪者区域”内的轨迹上的每个点都可能是截取点。
在第一张图像(较慢的目标)中,曲线是围绕目标的圆圈,一旦目标移出该圆圈(以粉红色表示的拦截点的右侧),追踪者可以始终到达目的地并且等待目标。如果您想在追踪者或目标的速度不恒定的情况下获得安全余量,这可能很有用。
在第二张图像(更快的目标)中,曲线是围绕追踪器的圆圈,并且该圆圈内目标轨迹上的每个点都可以是拦截点。追赶者可以例如垂直于目标的轨迹移动,以最小化行进的距离,或瞄准第一个和最后一个拦截点之间的中间点以最大化等待时间。