C++ 从2个点计算航向角?

C++ 从2个点计算航向角?,c++,algorithm,trigonometry,C++,Algorithm,Trigonometry,我试图从如下所示的两点获得航向角,在-180/180范围内。顺时针测量值应为正值,逆时针测量值应为负值 ;Assume a view from above: ; ; C ; | ; | ; | ; , A-------> (A's heading [A is facing this direction]) ; , ' ` ; , '

我试图从如下所示的两点获得航向角,在-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

任何数学大师都能提供帮助吗?

atan2
将为您提供相对于x轴(两个极坐标之一)的角度。所以,为了计算B和A之间的角度,计算B的方位角,计算A的方位角,然后减去另一个(可能加上或减去2*pi,以减少结果的绝对值)


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

您可以尝试以下方法:

#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;
}
#包括
#包括
结构对象
{
双x,y,dir;
Obj(double x,double y,double dir):x{x},y{y},dir{dir}
双进站角(Obj const和其他)
{
双标题=std::atan2(其他.x-本->x,其他.y-本->y)*180/3.1415926535897-本->dir;
如果(航向<-180)航向+=360;
如果(航向>180)航向-=360;
返回航向;
}
};
int main()
{
Obj A(10,10,90);
Obj-B(15,5,0);

std::我不确定这是否是问题所在,但在数学中(因此也适用于
atan2
)角度是逆时针的,您的
GetHeadingAngle
实现在哪里?您是否在尝试计算角度之前将向量规格化为长度1?可能重复我正在尝试重新创建GetHeadingAngle函数的功能(用于游戏Skyrim)在C++中编写它。它是如何工作的。我不确定向量是否在函数中被标准化了,我不是数学大师,但是你也可以在向量的方向上得到一些帮助。@它正在前进,就像你正在计算的那个。图中A的租金方向是90,等等。