2009-06-16 47 views
5

我想要以45度的增量檢測iPhone的方向。理想情況下,我希望能夠沿任何軸獲取定位角度。檢測iPhone的屏幕方向

我需要做的檢測類似於當方向更改時,iPhone的Trism會向屏幕當前底部位置閃爍箭頭。

我已經編碼了一些東西,但實際上並不理解加速計讀數是如何工作的,並且可以在正確的方向上使用微調。我現在的代碼記錄了當前的角度,但即使手機是平的,我也會得到每秒幾次瘋狂變化的讀數。從日誌

- (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

我覺得你的問題是,你正在使用int變量,當你想float

我覺得accelerationX和-Y應該是實例變量,因此:

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

應該給你更多你所期待的。

+0

感謝您的回覆,我將代碼更改爲使用int整數,但我仍然得到當設備平躺時計算的波動值大幅波動的結果。 – Simon 2009-06-16 07:29:25

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); 

應該給予更精確的結果,而不突然跳躍。