从2点计算航向角?

时间:2018-01-12 14:07:39

标签: c++ algorithm trigonometry

我正试图在-180/180范围内从两点获得航向角,如下所示。顺时针测量应为正,而逆时针应为负。

;Assume a view from above:
;
;              C
;              |
;              |
;              |
;            , A------->  (A's heading [A is facing this direction])
;        , '    `
;    , '          `
;  D                `
;                     `
;                       `
;                         B

float fAngle = A.GetHeadingAngle(B) ;fAngle will equal 45.0
float gAngle = A.GetHeadingAngle(C) ;gAngle will equal -90.0
float hAngle = A.GetHeadingAngle(D) ;hAngle will equal 150.0 (approx)

我尝试过使用atan2和两点坐标的差异来获得角度:

headingangle = atan2(dy, dx) * (180.0 / MATH_PI);

但它没有给出预期的结果。例如:

expected HeadingAngle = -10.443440
actual HeadingAngle = 107.463173

任何数学专家都能帮忙吗?

2 个答案:

答案 0 :(得分:0)

atan2会给你一个相对于x轴的角度(两个极坐标之一)。因此,要计算B和A之间的角度,计算B的方位角,计算A的方位角,并减去其中一个(可能加上或减去2 * pi,以减少结果的绝对值)。

请注意,角度的定义与标准角度相反(正方向通常是逆时针方向),因此您必须否定atan2的结果(或者,简单地从第一个方位角中减去第二个方位角) )。

答案 1 :(得分:0)

您可以尝试这样的事情:

#include <cmath>
#include <iostream>

struct Obj
{
    double x, y, dir;
    Obj(double x, double y, double dir) :x{ x }, y{ y }, dir{ dir } {}
    double GetHeadingAngle(Obj const &other)
    {
        double heading = std::atan2(other.x - this->x, other.y - this->y) * 180 / 3.1415926535897 - this->dir;
        if (heading < -180) heading += 360;
        if (heading > 180) heading -= 360;
        return heading;
    }
};


int main() 
{
    Obj A(10, 10, 90);

    Obj B(15, 5, 0);
    std::cout << A.GetHeadingAngle(B) << std::endl; // 45

    Obj C(10, 15, 0);
    std::cout << A.GetHeadingAngle(C) << std::endl; // -90

    Obj D(5, 5, 0);
    std::cout << A.GetHeadingAngle(D) << std::endl; // 135

    return 0;
}

https://ideone.com/MyKdOy