#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;
}
I2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8aW9zdHJlYW0+CgpzdHJ1Y3QgT2JqCnsKCWRvdWJsZSB4LCB5LCBkaXI7CglPYmooZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgZGlyKSA6eHsgeCB9LCB5eyB5IH0sIGRpcnsgZGlyIH0ge30KCWRvdWJsZSBHZXRIZWFkaW5nQW5nbGUoT2JqIGNvbnN0ICZvdGhlcikKCXsKCQlkb3VibGUgaGVhZGluZyA9IHN0ZDo6YXRhbjIob3RoZXIueCAtIHRoaXMtPngsIG90aGVyLnkgLSB0aGlzLT55KSAqIDE4MCAvIDMuMTQxNTkyNjUzNTg5NyAtIHRoaXMtPmRpcjsKCQlpZiAoaGVhZGluZyA8IC0xODApIGhlYWRpbmcgKz0gMzYwOwoJCWlmIChoZWFkaW5nID4gMTgwKSBoZWFkaW5nIC09IDM2MDsKCQlyZXR1cm4gaGVhZGluZzsKCX0KfTsKCgppbnQgbWFpbigpIAp7CglPYmogQSgxMCwgMTAsIDkwKTsKCQoJT2JqIEIoMTUsIDUsIDApOwoJc3RkOjpjb3V0IDw8IEEuR2V0SGVhZGluZ0FuZ2xlKEIpIDw8IHN0ZDo6ZW5kbDsgLy8gNDUKCglPYmogQygxMCwgMTUsIDApOwoJc3RkOjpjb3V0IDw8IEEuR2V0SGVhZGluZ0FuZ2xlKEMpIDw8IHN0ZDo6ZW5kbDsgLy8gLTkwCgoJT2JqIEQoNSwgNSwgMCk7CglzdGQ6OmNvdXQgPDwgQS5HZXRIZWFkaW5nQW5nbGUoRCkgPDwgc3RkOjplbmRsOyAvLyAxMzUKCglyZXR1cm4gMDsKfQ==