我正试图在-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
任何数学专家都能帮忙吗?
答案 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;
}