Вопрос

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

Обнаружение, которое мне нужно сделать, похоже на то, как 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
Это было полезно?

Решение

Я думаю, ваша проблема в том, что вы используете int переменные, когда вы хотите float.

Я думаю, что accelerationX и –Y должны быть переменными экземпляра и, таким образом:

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

Должно дать вам больше того, что вы искали.

Другие советы

Причина в том, что вы используете локальные переменные, в то время как они не должны быть локальными.

Попробуйте сделать следующее:

Объявлять переменные экземпляра:

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

...

other declarations

Обновите переменные в делегате акселерометра:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top