gpt4 book ai didi

algorithm - 两个具有纬度/经度坐标的运动物体的交点

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:09:05 24 4
gpt4 key购买 nike

尽管我已经阅读了几篇文章,但直到现在我才能真正解决这个问题-希望有人可以在这里提供帮助。

事实(知道变量):

  • 地球表面上的两个移动物体,都具有当前已知的纬度/经度坐标。
  • 两个物体的速度也是已知的(以 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
  • 方向:待计算

  • 对此的任何帮助将不胜感激,在此先感谢!

    最佳答案

    如果距离很小,并且您按照建议将纬度/经度坐标转换为平面上的 x,y 坐标,例如使用this question的答案,那么解决这个问题所需的数学就很简单了。

    下图显示了追逐者和目标在时间 0 的位置(红点和蓝点)、它们的速度(圆圈表示它们在时间 1、2、3...之后的范围)和目标的轨迹(蓝光)。

    绿色曲线包含目标和追逐者在以当前速度继续​​移动时可能同时出现的所有位置。这条曲线与目标轨迹的交点就是拦截点(粉红色的点)。

    moving target interception

    如果拦截发生在时间 t 之后,那么追逐者和目标经过的距离是 t.vc 和 t.vt。我们还知道0时刻追逐者与目标的距离d,以及追逐者与目标的连线段与目标轨迹的夹角α。如果我们将这些输入到 cosine rule我们得到:

    (t . vc)2 = (t . vt)2 + d2 - 2 . d . t . vt . cos(α)



    转换为 quadratic equation当我们求解时间 t 时:

    (vc2 - vt2) . t2 + (2 . d . vt . cos(α)) . t - d2 = 0



    如果我们使用 quadratic formula 解决这个问题:

    t = (- b ± √(b2 - 4 . a . c)) / (2 . a)
    where:
    a = vc2 - vt2
    b = 2 . d . vt . cos(α)
    c = - d2



    非负 discriminant表示可以截取,二次公式中加法得到的根是第一次或唯一一次截取。

    interception of faster target

    如上图所示,如果追逐者比目标慢,如果目标向追逐者移动(蓝光与绿色曲线相交),则可能有两个拦截点,但如果目标远离追逐者,则没有.在二次公式中使用加法给出第一个截点(使用减法将给出第二个)。

    然后我们可以计算出目标在时间 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°


    其他拦截点

    绿色曲线有效地将 2D 平面划分为目标首先到达的区域和追逐者首先到达的区域。如果您希望追逐者和目标以恒定速度移动并发生碰撞(想象一下,例如向移动的船只发射鱼雷),那么您将瞄准曲线上的一个点,两者将同时到达,如上面解释过。

    然而,如果追逐者可以到达一个点并在那里等待目标到达(想象一个人试图赶公共(public)汽车),那么目标轨迹上位于“追逐者区域”内的每个点都可能是拦截点.

    在第一幅图像(较慢的目标)中,曲线是围绕目标的一个圆圈,一旦目标移出这个圆圈(在粉红色指示的拦截点的右侧),追逐者总是可以先到达那里并等待目标。如果您想要一个安全边际以防追逐者或目标的速度不是恒定的,这可能很有用。

    在第二张图像(更快的目标)中,曲线是围绕追逐者的一个圆圈,并且该圆圈内目标轨迹上的每个点都可能是拦截点。追逐者可以例如垂直于目标的轨迹移动,以最大限度地减少行进距离,或瞄准第一个和最后一个拦截点之间的中间点,以最大限度地延长等待时间。

    关于algorithm - 两个具有纬度/经度坐标的运动物体的交点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37250215/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com