0

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

1 回答 1

1

这就是std::atan2函数的用途。

由于tan函数在半圈内是周期性的。从逻辑上讲,如果您否定两个坐标,则参数中的表达式是相同的,因此您无法区分这两种情况。因此,您必须首先通过检查符号来查看您所在的象限,如果您在负半空间中,则添加 180。该std::atan2功能将为您完成。

double angle = std::atan2(acc.y - acc.lastY, acc.x - acc.lastX) * (8 / PI);

它具有实际工作 when 的额外好处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)

与您一起将yabs符号相反的情况统一起来,但x相同。

此外,如果您想对值进行四舍五入,以使 0 表示沿x轴的方向稍微偏离任一侧,您需要通过添加一半的间隔宽度来修改舍入,并且您必须在归一化为 ⟨0 之前执行此操作, 2 π ) 范围。你会开始:

double angle = std::atan2(acc.y - acc.lastY, acc.x - acc.lastX) + PI/16;
于 2013-02-07T08:49:09.117 回答