2009-06-16 23 views
5

Chcę wykryć orientację iPhone'a z krokiem 45 stopni. Idealnie chciałbym móc uzyskać kąt orientacji wzdłuż dowolnej osi.Wykryj orientację ekranu iPhone'a

Wykrywanie, które muszę wykonać, jest podobne do tego, jak w przypadku wersji Trism iPhone zmienia strzałkę w kierunku aktualnej dolnej pozycji ekranu po zmianie orientacji.

Mam coś zakodowanego, ale tak naprawdę nie rozumiem, jak działają odczyty z przyspieszeniomierza i czy można użyć przesunięcia we właściwym kierunku. Mój aktualny kod rejestruje bieżący kąt, ale nawet gdy telefon jest płaski, odczyty zmieniają się dziko kilka razy na sekundę.

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

próbki z dziennika podczas gdy telefon jest płaski:

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 

Odpowiedz

4

Myślę, że problemem jest to, że używasz int zmienne kiedy chcesz float.

myślę accelerationX i Y powinny być zmienne instancji i tak:

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

powinno dać więcej to, czego szukali.

+0

Dziękuję za odpowiedź, zmieniłem kod, aby używać intats z ints, ale nadal otrzymuję wynik szalenie zmiennych wartości, które są obliczane, gdy urządzenie leży płasko. – Simon

+0

Dodano kilka linii z dziennika do pytania. – Simon

+0

Ah, pominął twój komentarz po raz pierwszy w odniesieniu do zmiennych instancji, wygląda na to, że może być rozwiązaniem, skontaktuje się z Tobą. – Simon

3

Powodem jest to, że używasz zmiennych lokalnych, podczas gdy nie powinny one być lokalne.

Spróbuj wykonać następujące czynności:

Zadeklaruj zmienne instancji:

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

... 

other declarations 

zmienne Aktualizuj akcelerometr Delegat:

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

Powinno dać bardziej precyzyjne wyniki bez nagłych skoków.

Powiązane problemy