你如何找到两点之间的相对影响?

时间:2015-11-30 00:38:45

标签: android c math navigation bearing

double computeHeading(double latitude1, double longitude1, double latitude2, double longitude2)
{
    double degToRad = PI / 180.0;
    double phi1 = latitude1*degToRad;
    double phi2 = latitude2*degToRad;
    double lam1 = longitude1*degToRad;
    double lam2 = longitude2*degToRad;

    double x,y;
    x = cos(phi2) * sin(lam2-lam1);
    printf("X is %lf\n", x);
    y = cos(phi1) * sin(phi2) - sin(phi1) * cos(phi2) * cos(lam2-lam1);
    printf("Y is %lf\n", y);
    return atan2(x,y)*180/PI;
}

所以,在研究找到轴承公式时,我一直在使用上述函数来获得两个纬度和经度点之间的真实方位(基于北方)。

我目前正在开发一个小型导航小部件,它使用Android中的GPS数据,当我移动并改变我的方向时,箭头指向A点(如果我在B点)。

所以我们假设一个场景:

我在B点,朝北,A点对我来说是300度(有点西北)。如果我面向南方,没有移动,我的B点与A点的相对位置应该是120度? (300-180)...

有人可以告诉我有关这些的正确计算。

TIA。

1 个答案:

答案 0 :(得分:1)

有几种方法可以解决这个问题。第一个是你看起来正在做的事情,假设地球是球形的。相对轴承使用Haversine配方计算,用于大圆导航。给定起点和终点,这个公式找到了通过这两点的大圆。由此可以计算出初始轴承。这条大圆路线是两点之间的最短路线,但是一般来说,轴承在路线上不会是恒定的。此外,除了在一些非常具体的情况下,反向轴承的行为并不像您期望的那样,如果您想要一般地确定它,您将不得不执行另一个计算来反转起点和终点。

您可以使用的另一种方法是Rhumb系列配方。在这种情况下,起点和终点之间的方位是恒定的,如果您愿意,可以使用您对反向路线的关系。由于这通常与大圆距离不同,因此遵循Rhumb线不会导致两点之间的最短路径,但它确实通过保持路线不变来简化导航。

Calculate distance, bearing and more between Latitude/Longitude points

详细介绍了这两种方法

另一种用于大圆导航的公式,它使用更精确的地球形状表示,一种扁椭球,一种特殊类型的椭圆体,归因于VincentyKarney提供了额外的增强功能。 {3}}。在这些情况下,配方相当复杂,对于大多数应用来说可能有点过分,而且性能比上面的Haversine配方差很多。但如果您需要,这些配方可提供更好的准确度。

<强>更新

根据下面的评论,主要问题是弄清楚要走多远。这将只是包含当前航向的大圆的平面法线与所需航向之间的角度。要获得当前航向上飞机的法线,您需要当前位置L以及当前航向C上距离一定距离的点。法线只是V = L×C。要计算沿着所需航向的包含大圆的平面的法线,您只需要知道所需路线上的一个点,您已经以目标点的形式获得了该点,我们称之为D。然后,您可以按U = L×D找到正常值。它们之间的角度由θ = acos((U∙V)/(|U||V|))给出。

要查找LCD,您必须转换Latitude, Longitude, Altitude (LLA) coordinates into Earth Centered, Earth Fixed (ECEF) coordinates