这个问题我到现在还不能真正解决,虽然我已经读了好几篇文章-希望有人能在这里帮忙。
事实(已知变量):
地球表面的两个运动物体,都有当前已知的经纬度坐标。
这两个物体的速度也是已知的(以m/s为单位)。
一个物体的方向(角度)是已知的。
现在我要计算第二个移动对象与另一个移动对象相交所需的方向(角度)。
由于物体之间的距离很小(仅在5-20公里范围内),不需要很高的精度,因此可以将地球表面视为平面。
因此,我已经尝试过与这个伟大的图书馆合作:
http://www.codeproject.com/Articles/990452/Interception-of-Two-Moving-Objects-in-D-Space
但我不知道如何将速度(m/s)来回转换为经纬度速度向量,所以我并没有真正把它付诸实践。
为了更好地理解这里的问题,请以值为例:
移动对象1(流道):
当前位置:纬度:38.565,经度:98.513
速度:100 m/s
方向:270’
移动对象2(追踪器):
当前位置:纬度:38.724,经度:98.449
速度:150 m/s
方向:待计算
如有任何帮助,我们将不胜感激,谢谢!

最佳答案

如果距离很小,并且按照您的建议,使用this question的答案将纬度/经度坐标转换为平面上的x,y坐标,则解决此问题所需的数学方法非常简单。
下图显示了追逐者和目标在时间0的位置(红色和蓝色圆点)、速度(圆圈显示了时间1、2、3…后的范围)和目标的轨迹(蓝色射线)。
绿色曲线包含目标和追击者以当前速度移动时可能在同一时刻的所有位置。该曲线与目标轨迹的交点是拦截点(粉色点)。
algorithm - 具有纬度/经度坐标的两个运动对象的交点-LMLPHP
如果拦截发生在时间t之后,那么追击器与目标的距离为t.vc和t.vt,我们还知道追击器与目标在时间0时的距离d,以及追击器与目标连接的线段与目标轨迹的夹角α。如果我们将这些输入cosine rule中,我们将得到:
(T.vc)2=(tvt)2+d2-2.D。t佛蒙特州。cos(α)
当我们求解时间t时,它转化为这个quadratic equation
(VC2-VT2)。T2+(2.D。佛蒙特州。cos(α)t-d2=0
如果我们使用quadratic formula解决这个问题:
T=(-B~√(B2-4.一个。c)/(2.(一)
在哪里?
A=VC2-VT2
B=2。D。及物动词。cos(α)
C=-D2
非负discriminant意味着截获是可能的,在二次公式中用加法得到的根是截获的第一次或唯一一次。
algorithm - 具有纬度/经度坐标的两个运动对象的交点-LMLPHP
如上图所示,如果追猎者比目标慢,如果目标向追猎者移动(蓝色光线与绿色曲线相交),则可能有两个拦截点,但如果目标远离追猎者,则无拦截点。在二次公式中使用加法给出第一个截取点(使用减法给出第二个截取点)。
然后我们可以计算出时间t后目标的位置,即拦截点,以及从追击者到这个点的方向。
下面的javascript代码片段演示了这个方法,其中包含来自两个图像的值。它使用弧度和方向的角度:0=右,π/2=上,π=左,-π/2=下。追踪器和目标速度相等(且曲线为直线)的情况用isosceles triangle theorem来求解,否则会导致二次方程中的除零。

function intercept(chaser, target) {
    var dist = distance(chaser, target);
    var dir = direction(chaser, target);
    var alpha = Math.PI + dir - target.dir;
    // EQUAL VELOCITY CASE: SOLVE BY ISOSCELES TRIANGLE THEOREM
    if (chaser.vel == target.vel) {
        if (Math.cos(alpha) < 0) return NaN;    // INTERCEPTION IMPOSSIBLE
        return (dir + alpha) % (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(alpha);
    var c = -Math.pow(dist, 2);
    var disc = Math.pow(b, 2) - 4 * a * c;
    if (disc < 0) return NaN;                   // 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 rad = -58.17°
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 rad = -102.4°

其他拦截点
绿色曲线有效地将二维平面划分为目标首先到达的区域和追击者首先到达的区域。如果你想让追逐者和目标以恒定的速度移动并发生碰撞(想象一下,一枚鱼雷正朝一艘正在移动的船发射),那么你应该瞄准曲线上的一个点,两个点将同时到达,如上所述。
然而,如果追击者能够到达一个点并在那里等待目标到达(例如,想象一个人试图赶上一辆公共汽车),那么目标轨迹上位于“追击者区域”内的每个点都可能是拦截点。
在第一幅图像中(较慢的目标),曲线是一个围绕目标的圆,一旦目标移出这个圆(在粉色指示的拦截点右侧),追击者总是可以先到达那里,然后等待目标。如果你想在追击者或目标的速度不是恒定的情况下有一个安全裕度,这可能是有用的。
在第二幅图像(更快的目标)中,曲线是围绕追猎者的一个圆,在这个圆内目标轨迹上的每个点都可能是拦截点。追踪器可以例如垂直移动到目标的轨迹上,以便最小化所行进的距离,或者瞄准第一和最后拦截点之间的中点,以最大化等待时间。

09-06 00:38