我正在尝试使用atan2将-1到1的范围转换为弧度,然后从弧度转换为度。
但是当atan2(0,1)等于0等于90.0时,我在这里做什么错了?
float radians = atan2(0, 1);
float degrees = (radians * 180 / PI);
if(radians < 0)
{
degrees += 360;
}
编辑:好的,这次我以正确的方式插入了这些值。
float xaxisval = controller->left_stick_x_axis();
float yaxisval = controller->left_stick_y_axis();
// plug values into atan2
float radians = atan2(yaxisval, xaxisval);
float degrees = (radians * 180 / PI);
if (radians < 0)
{
degrees += 360;
}
对于上下文,xaxisval和yaxisval从模拟摇杆中获取一个值,其最大值在右侧1,最小值在-1左侧。因此,当我向右按下模拟摇杆时,yaxisval等于0,xaxisval等于1。
这应该返回90度,就像您将模拟摇杆想象为完整的360度圆一样。向上方向为360/0,向右为90,向下方向为180,向左为270,依此类推。
我将这些值粘贴到调试器中,这就是它返回的结果。
xaxisval: 1.00000
yaxisval: 0.00000
degrees: 0.00000
但是我希望这个方向上升90度,它似乎跳了90度,我测试了下降位置,它等于90。有什么建议吗?
调试输出: 操纵杆向上位置
xaxisval: 0.00000
yaxisval: -1.00000
degrees: 270.00000
操纵杆右位置
xaxisval: 1.00000
yaxisval: 0.00000
degrees: 0.00000
操纵杆向下位置
xaxisval: 0.00000
yaxisval: 1.00000
degrees: 90.00000
操纵杆的左位置
xaxisval: -1.00000
yaxisval: 0.00000
degrees: 180.00000
操纵杆东北位置
xaxisval: 0.929412
yaxisval: 0.592157
degrees: 327.497528
答案 0 :(得分:6)
您以错误的顺序传递了参数。 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 +↑,而您的设置似乎是y-↑
因此,如果要将常规atan2
的旋转转换为所需的旋转,则需要像这样转换它:
float radians = atan2(yaxisval, xaxisval);
float degrees = (radians * 180 / PI);
degrees = 90 - degrees;
if(degrees < 0)
degrees += 360;
然后,您从那里要做的所有工作都可能会根据您是否按预期 向上推操纵杆以返回正值或负值来变换y轴。这取决于您的程序域。