Вы передаете аргументы в неправильном порядке.std::atan2
ожидает аргументы в порядке y,x
, а не x,y
.
Да, это невероятно глупо, но это связано с тем, как функция тангенса определяется в первомместо (которое определяется как отношение y-компонента к x-компоненту, а не наоборот) и, как и многие другие нотационные ошибки в математике, инерция возникла тысячи лет назад, и вы не можете от нее отказатьсябез излишеств.
Так напишите свой код так:
float radians = atan2(1, 0);
Или, если вы хотите, чтобы все было как можно более явным:
float x = 0, y = 1;
float radians = atan2(y, x); //Yes, that's the correct order, don't @ me
И вы 'Вы получите ожидаемые результаты.
Ваша вторая проблема заключается в том, что значения, соответствующие atan2
, не совпадают с указанными вами направлениями.То, что вы хотите - это круг, где верхняя часть равна 0 °, правая сторона равна 90 °, нижняя часть равна 180 °, а левая сторона - 270 °.Вставка значений в atan2
вместо этого приведет к получению значений, где правая сторона равна 0 °, верхняя сторона равна 90 °, левая равна 180 °, а нижняя равна 270 °.
Кроме того, при сравнениис моим собственным оборудованием, моя ось Y перевернута по сравнению с вашей.У меня есть y + ↑, тогда как ваша установка выглядит как y- ↑
Так что если вы хотите преобразовать обычное вращение atan2
в нужное вам вращение, вам нужно преобразовать его следующим образом:
float radians = atan2(yaxisval, xaxisval);
float degrees = (radians * 180 / PI);
degrees = 90 - degrees;
if(degrees < 0)
degrees += 360;
Затем, все, что вам нужно сделать, это, возможно, преобразовать ось Y в зависимости от того, ожидаете ли вы 1034 * джойстика, который поднимается, чтобы вернуть положительное или отрицательное значение.Это зависит от области вашей программы.