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関数はちょうど半円で周期的であるため. 論理的には、両方の座標を否定すると、引数の式は同じになるため、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;
于 2013-02-07T08:49:09.117 に答える