そのためのstd::atan2
関数です。
tan関数はちょうど半円で周期的であるため. 論理的には、両方の座標を否定すると、引数の式は同じになるため、2 つのケースを区別することはできません。したがって、負の半空間にいる場合は 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)
あなたはyabs
の反対の符号でケースを統一していますが、同じxです。
さらに、0 がx軸に沿った方向をどちらかの側にわずかにずらして表すように値を丸めたい場合は、間隔幅の半分を追加して丸めを変更する必要があり、⟨0 に正規化する前に行う必要があります。 , 2 π ) 範囲。あなたはから始めます:
double angle = std::atan2(acc.y - acc.lastY, acc.x - acc.lastX) + PI/16;