1

私は、最良の時でもラジアンにかなり混乱しているので、UIView を回転させるときは度単位で作業する傾向があります。これまでのところ、次の式を使用して度をラジアンに変換してきました。

#define radians(x) (M_PI * x / 180.0)

ここまでは順調ですね。ユーザーが360度以上回転している画面にUIViewがあり、画像が回転した度数を画面に表示したい場合に問題が発生します。私はこれを持っており、180度まで正常に動作します:

float rot = [recognizer rotation];
[self.steeringWheel setTransform:CGAffineTransformRotate([self.steeringWheel transform], (rot))]; // turn wheel

CGFloat radians = atan2f(steeringWheel.transform.b, steeringWheel.transform.a); 
CGFloat degrees = radians * (180 / M_PI);

self.degreesBox.text = [NSString stringWithFormat:@"%1.0f", degrees]; // show degrees of rotation on screen

180度の後、私の読み取り値は-179、-178などに変わり、ゼロに戻ります。代わりに、最大 359 までカウントし続けたい (可能であれば、ゼロ、1、2 などに戻る)。

179 に 2、178 に 3 などを加算する式を使用して適切な量を取得することもできますが、ホイールを反対方向に回すとうまくいきません (-1 度の回転は 359 と表示されます)。本当に 1 または -1 として読み上げたい場合)。

これが理にかなっていることを願っています。基本的には、ホイールが開始点から各方向にどれだけ回転したかを読み取りたいと考えています。私が今得ているのは、最短ルートを経由して開始点まで何度戻ったかの読み取りです。

4

2 に答える 2

1

このコードを試してください:

CGFloat radians = atan2f(steeringWheel.transform.b, steeringWheel.transform.a); 
if (radians < 0.0) radians += 2 * M_PI;
CGFloat degrees = radians * (180 / M_PI);

編集:

あなたの質問を読み直した後、私はあなたの問題が実際にどこにあるかを見ました。atan2は常に範囲 (−π, π] の結果を返します。

そして、ステアリング ホイールを左に完全な円を、右に完全なクリクルを回転できるようにしたいようです。これは、新しい角度と古い角度を比較することで解決できるため、ユーザーがホイールを時計回りまたは反時計回りに回転させているかどうかがわかります。

ユーザーがホイールを開始 (アイドル) 位置から左 (CCW) に回転させたときにフラグを設定して、それに応じて標識を管理することもできます。

于 2012-06-02T17:11:37.770 に答える