矢量量化到方向码字

时间:2013-02-07 04:12:30

标签: c++ vector

我需要量化我的矢量并从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)); 

1 个答案:

答案 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;