ab-*_*ols 3 algorithm math geometry latitude-longitude
尽管我已经阅读了几篇文章,但直到现在我还是无法真正解决这个问题-希望有人可以在这里提供帮助。
事实(知道变量):
现在,我想计算第二个移动物体与另一个移动物体相交(撞)所需的方向(角度)。
由于物体之间的距离很小(仅在5-20 km之内),并且不需要很高的精度,因此可以将地球表面视为平面。
因此,我已经尝试使用这个出色的库:http : //www.codeproject.com/Articles/990452/Interception-of-Two-Moving-Objects-in-D-Space
但是我真的不知道该如何工作,因为我不知道如何将以m / s为单位的速度来回转换为纬度/经度速度矢量。
为了更好地理解问题,这里有一个带有值的示例:
对此表示感谢,在此先感谢您!
如果距离很小,并且按照您的建议将纬度/经度坐标转换为平面上的x,y坐标,例如使用对该问题的答案,则解决此问题所需的数学非常简单。
下图显示了追踪器和目标在时间0处的位置(红色和蓝色点),它们的速度(圆圈显示了在时间1、2、3 ...之后的范围)以及目标的轨迹(蓝光)。
绿色曲线包含目标和追赶者如果继续以当前速度运动可能同时处于的所有位置。该曲线与目标轨迹的相交点是拦截点(粉红色点)。
如果拦截发生在时间t之后,则追赶者和目标之间的距离为tv c和tv t。我们还知道在时间0处追赶者与目标之间的距离d,以及追赶者与目标之间的线段与目标轨迹之间的夹角α。如果将它们输入到余弦规则中,则会得到:
(吨诉c ^)2 =(T诉吨)2 + d 2 - 2。d。。v 牛逼。cos(α)
当我们求解时间t时,它将转换为二次方程:
(v c 2 -v t 2)。吨2 +(2。d诉吨。COS(α))。t-d 2 = 0
如果我们使用二次公式来解决这个问题:
T =( - B±√(B 2。 - 4 C))/(2)
,其中:
一个= V c ^ 2 - v 吨2
B = 2。d。v 牛逼。cos(α)
c =-d 2
非负判别意味着可以拦截,并且通过在二次公式中使用加法获得的根是拦截的第一时间或唯一时间。
如上图所示,如果追赶者比目标慢,那么如果目标朝着追赶者移动(蓝光与绿色曲线相交),则可能存在两个拦截点,但是如果目标远离追赶者,则没有拦截点。 。在二次公式中使用加法可得出第一个拦截点(使用减法可得出第二个拦截点)。
然后,我们可以计算目标时间t之后的时间,该时间是拦截点,以及从追赶者到该点的方向。
下面的JavaScript代码片段演示了此方法,并提供了两个图像的值。它使用以弧度为单位的角度和方向:0 =右,π/ 2 =向上,π=左,-π/ 2 =向下。使用等腰三角形定理可解决追赶者和目标具有相等速度(曲线为直线)的情况,因为否则将导致二次方程除以零。
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°Run Code Online (Sandbox Code Playgroud)
其他拦截点
绿色曲线有效地将2D平面划分为目标首先到达的区域和追赶者首先到达的区域。如果您想使追赶者和目标以恒定的速度运动并发生碰撞(例如,鱼雷在移动中的船上被发射),那么您将瞄准曲线上的一点,两者将同时到达以上说明。
但是,如果追赶者可以到达某个点并等待目标到达(例如,有人试图赶上公共汽车),那么目标轨迹上“追赶者区域”内的每个点都可能是拦截点。
在第一个图像(较慢的目标)中,曲线是围绕目标的圆,一旦目标移出该圆(在粉红色的拦截点右侧),追赶者就可以始终先到达那里并等待目标。如果您想要安全余量,以防追赶者或目标的速度不恒定,这可能很有用。
在第二个图像(速度更快的目标)中,曲线是追赶者周围的圆,并且目标轨迹上该圆内的每个点都可能是拦截点。追赶者可以例如垂直于目标轨迹移动,以最小化行进的距离,或者瞄准第一个和最后一个拦截点之间的中点,以最大化等待时间。
| 归档时间: |
|
| 查看次数: |
2421 次 |
| 最近记录: |