2

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

但是 atan2(0,1) 应该等于 90.0 时等于 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
4

1 回答 1

6

您以错误的顺序传递参数。std::atan2期望参数在 ordery,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-↑</sup>

因此,如果要将正常atan2旋转转换为所需的旋转,则需要将其转换为:

float radians = atan2(yaxisval, xaxisval);
float degrees = (radians * 180 / PI);
degrees = 90 - degrees;
if(degrees < 0)
    degrees += 360;

然后,您所要做的就是根据您希望向上推的操纵杆返回正值还是负值来转换 y 轴。这取决于您的程序的域。

于 2019-04-12T20:47:14.357 回答