2009-06-16 5 views
5

Я хочу определить ориентацию iPhone с шагом 45 градусов. В идеале я хотел бы получить угол ориентации вдоль любой оси.Определить ориентацию экрана iPhone

Обнаружение, которое мне нужно сделать, похоже на то, как Trism для iPhone мигает стрелкой в ​​направлении текущего нижнего положения экрана при изменении ориентации.

У меня есть что-то закодированное, но на самом деле не понимаю, как работают показания акселерометра и может использовать подталкивание в правильном направлении. Мой текущий код регистрирует текущий угол, но даже когда телефон плоский, я получаю показания, которые дико меняются несколько раз в секунду.

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

Спасибо за ваш ответ, я изменил код, чтобы использовать float int 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); 

Это должно дать более точные результаты без резких скачков.

Смежные вопросы