使用atan2将范围从-1到1转换为度

Kin*_*pin 2 c++ math atan

我正在尝试使用atan2将范围从-1到1转换为弧度,然后从弧度转换为度。

但是atan2(0,1)等于0时应等于90.0我在这里做错了什么?

float radians = atan2(0, 1);
float degrees = (radians * 180 / PI);
if(radians < 0)
{
    degrees += 360;
}
Run Code Online (Sandbox Code Playgroud)

编辑:好的,所以这次我以正确的方式插入了这些值。

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;
}
Run Code Online (Sandbox Code Playgroud)

对于上下文,xaxisval和yaxisval从模拟摇杆中获取一个值,其最大值在右边1,最小值在-1左边。因此,当我向右按模拟摇杆时,yaxisval等于0,xaxisval等于1。

这应该返回90度,就像您将模拟摇杆想象为完整的360度圆一样。上方向是360/0,右方向是90,下方向是180,左方向是270,依此类推。

我将这些值粘贴到调试器中,这就是它返回的结果。

xaxisval: 1.00000
yaxisval: 0.00000
degrees: 0.00000
Run Code Online (Sandbox Code Playgroud)

但是我希望这个方向上升到90度,它似乎已经上升了90度,我测试了下降位置,它等于90。有什么建议吗?

调试输出:操纵杆向上位置

xaxisval: 0.00000
yaxisval: -1.00000
degrees: 270.00000
Run Code Online (Sandbox Code Playgroud)

操纵杆右位置

xaxisval: 1.00000
yaxisval: 0.00000
degrees: 0.00000
Run Code Online (Sandbox Code Playgroud)

操纵杆向下位置

xaxisval: 0.00000
yaxisval: 1.00000
degrees: 90.00000
Run Code Online (Sandbox Code Playgroud)

操纵杆左侧位置

xaxisval: -1.00000
yaxisval: 0.00000
degrees: 180.00000
Run Code Online (Sandbox Code Playgroud)

操纵杆东北位置

xaxisval: 0.929412
yaxisval: 0.592157
degrees: 327.497528
Run Code Online (Sandbox Code Playgroud)

Xir*_*ema 6

您以错误的顺序传递了参数。std::atan2期望参数按顺序排列y,x,而不是x,y

是的,这是令人难以置信的愚蠢,但它与切线函数在第一个位置的定义方式有关(定义为y分量与x分量之比,而不是相反),并且像许多符号一样数学中的错误,惯性在数千年前就已定下来,如果没有曲柄,您将无法反驳它。

因此,像这样编写代码:

float radians = atan2(1, 0);
Run Code Online (Sandbox Code Playgroud)

或者,如果您希望所有内容都尽可能明确:

float x = 0, y = 1;
float radians = atan2(y, x); //Yes, that's the correct order, don't @ me
Run Code Online (Sandbox Code Playgroud)

您将获得预期的结果。


您的第二个问题是,与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;
Run Code Online (Sandbox Code Playgroud)

然后,您从那里要做的所有工作都可能会根据您希望向上推动操纵杆返回正值还是负值来转换y轴。这取决于您的程序的领域。