使用 atan2 将范围从 - 1 到 1 转换为度
Using atan2 to turn a range from - 1 to 1 into degrees
我正在尝试使用 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
您以错误的顺序传入参数。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 轴。这取决于您的程序域。
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 是否可以从int转换为enum类类型
- 了解 GLM- openGL 中的相机转换
- 使用 atan2 将范围从 - 1 到 1 转换为度