2009-06-16 11 views
5

iPhoneの向きを45度単位で検出したいと考えています。理想的には、どの軸に沿っても向きの角度を取得できるようにしたいと考えています。iPhoneの画面の向きを検出する

私が行う必要がある検出は、向きが変わったときにiPhoneのTrismが画面の現在のボトム位置に向かって矢印を点滅させる方法と似ています。

私は何かをコード化しましたが、実際に加速度計の読み方がどのように機能しているか理解できておらず、正しい方向にナッジを使用できました。私の現在のコードは現在の角度をログに記録しますが、電話機がフラットなときでさえ、1秒に数回激しく変化する読みがあります。

- (void) checkOrientation:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration 
{ 
    int accelerationX = acceleration.x * kfilteringFactor + accelerationX * (1.0 - kfilteringFactor); 
    int accelerationY = acceleration.y * kfilteringFactor + accelerationY * (1.0 - kfilteringFactor); 

    float currentRawReading = (atan2(accelerationY, accelerationX)) * 180/M_PI; 
    NSLog(@"Angle: %f",currentRawReading); 
} 

ログからのサンプルの電話が平坦な:

2009-06-16 17:29:07.987 [373:207] Angle: 0.162292 
2009-06-16 17:29:07.994 [373:207] Angle: 179.838547 
2009-06-16 17:29:08.014 [373:207] Angle: 179.836182 
2009-06-16 17:29:08.032 [373:207] Angle: -90.000000 
2009-06-16 17:29:08.046 [373:207] Angle: 179.890900 
2009-06-16 17:29:08.059 [373:207] Angle: -90.000000 
2009-06-16 17:29:08.074 [373:207] Angle: 179.917908 
2009-06-16 17:29:08.088 [373:207] Angle: -179.950424 
2009-06-16 17:29:08.106 [373:207] Angle: 90.000000 
2009-06-16 17:29:08.119 [373:207] Angle: 90.000000 
2009-06-16 17:29:08.134 [373:207] Angle: -179.720245 

答えて

4

私はあなたの問題はあなたがfloatをしたいときにint変数を使用していることだと思います。

は私がaccelerationX考えると-Yは、このようにインスタンス変数と次のようになります。

accelerationX = acceleration.x * kfilteringFactor + accelerationX * (1.0 - kfilteringFactor); 
accelerationY = acceleration.y * kfilteringFactor + accelerationY * (1.0 - kfilteringFactor); 

は、より多くのあなたが探していた何を与える必要があります。

+0

返信いただきありがとうございます。私はintsの代わりに浮動小数点数を使用するようにコードを変更しましたが、デバイスが横たわっているときに計算された値が大きく変動する結果が得られます。 – Simon

+0

ログからいくつかの行を質問に追加しました。 – Simon

+0

ああ、あなたのコメントをインスタンス変数に関して初めて見逃しました。それが解決策かもしれないように見えますが、あなたに戻ってきます。 – Simon

3

なぜなら、ローカル変数を使用しているわけではありませんが、ローカル変数は使用していないからです。次の操作を行うための

試してみてください。

インスタンス変数を宣言:加速度計デリゲートで

@interface YourViewControllerClass: UIViewController { 
    float accelerationX, accelerationY; 
} 

... 

other declarations 

更新変数:

accelerationX = acceleration.x * kfilteringFactor + accelerationX * (1.0 - kfilteringFactor); 
accelerationY = acceleration.y * kfilteringFactor + accelerationY * (1.0 - kfilteringFactor); 

それは突然のジャンプなく、より正確な結果を与える必要があります。

関連する問題