我需要量化我的矢量并从0 to 15
生成方向码字。所以我使用C ++实现了以下代码行来实现它。只需传递2个点并使用该点计算atan()
值。但它只返回0 to 7
。其他值不归还。有时它会返回非常大的数字,如42345
。如何修改此选项以返回0 to 15
double angle = abs(atan((acc.y - acc.lastY)/(acc.x - acc.lastX))/(20*3.14159/180));
答案 0 :(得分:1)
这就是std::atan2
功能的用途。
由于 tan 函数仅在半圈内是周期性的。从逻辑上讲,如果你否定两个坐标,那么参数中的表达式就会相同,所以你不能区分两种情况。因此,您必须首先通过检查符号来查看您所在的象限,如果您处于负半空间,则必须添加180。 std::atan2
功能将为您完成。
double angle = std::atan2(acc.y - acc.lastY, acc.x - acc.lastX) * (8 / PI);
它具有在acc.x == acc.lastX
时实际工作的额外好处,而你的表达式将信号除以零。
此外,使用abs
是错误的。如果你得到-π和π之间的角度,你想获得0到2 π之间的角度,你需要写:
double angle = std::atan2(acc.y - acc.lastY, acc.x - acc.lastX); // keep it in radians
if(angle < 0)
angle += 2 * PI;
return angle * (8 / PI); // convert to <0, 16)
使用abs
,您可以使用 y 的相反符号统一案例,但 x 相同。
此外,如果要对值进行舍入,使得0表示沿着 x 轴的方向稍微偏离任何一侧,则需要通过添加间隔宽度的一半来修改舍入,并且''在归一化到⟨0,2<π范围之前必须做的事情。你可以从:
开始double angle = std::atan2(acc.y - acc.lastY, acc.x - acc.lastX) + PI/16;