2009-06-16 11 views
5

Ich möchte die Ausrichtung des iPhone in 45-Grad-Schritten erkennen. Idealerweise würde ich gerne den Orientierungswinkel entlang einer beliebigen Achse erhalten.iPhone-Bildschirmausrichtung erkennen

Die Erkennung, die ich tun muss, ist ähnlich wie Trism für das iPhone einen Pfeil in Richtung der aktuellen unteren Position des Bildschirms blinkt, wenn sich die Ausrichtung ändert.

Ich habe etwas codiert, aber wirklich nicht verstehen, wie die Beschleunigungsmesser Messwerte funktionieren und könnte einen Anstupser in die richtige Richtung verwenden. Mein aktueller Code protokolliert den aktuellen Blickwinkel, aber selbst wenn das Telefon flach ist, bekomme ich einige Male pro Sekunde wild variierende Werte.

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

Probe von log während Telefon flach ist:

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 

Antwort

4

Ich denke, Ihr Problem ist, dass Sie int Variablen verwenden, wenn Sie float wollen.

ich denke, die accelerationX und Y sollte Instanzvariablen und damit:

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

Sollten Sie mehr geben, was Sie suchen.

+0

Vielen Dank für Ihre Antwort, ich habe den Code geändert, um Floats intad von Ints zu verwenden, aber ich bekomme immer noch das Ergebnis von stark schwankenden Werten berechnet, wenn das Gerät flach liegt. – Simon

+0

Einige Zeilen aus dem Protokoll zur Frage hinzugefügt. – Simon

+0

Ah, verpasste Ihren Kommentar das erste Mal in Bezug auf die Instanzvariablen, sieht aus wie es die Lösung sein könnte, wird sich an Sie wenden. – Simon

3

Der Grund ist, dass Sie lokale Variablen verwenden, während sie nicht lokal sein sollten.

Versuchen Sie Folgendes zu tun:

Deklarieren Instanzvariablen:

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

... 

other declarations 

aktualisieren Variablen Beschleunigungssensor delegieren:

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

Es sollte geben präzisere Ergebnisse ohne plötzliche Sprünge.