Frage

Ich möchte die Ausrichtung des iPhone in Schritten von 45 Grad erkennen. Idealerweise würde ich in der Lage sein, den Orientierungswinkel entlang jeder Achse zu bekommen.

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

Ich habe etwas codiert, verstehe aber wirklich nicht, wie die Beschleunigungsmesserwerte funktionieren und könnten einen Anstoß in die richtige Richtung verwenden. Mein aktueller Code protokolliert den aktuellen Winkel, aber selbst wenn das Telefon flach ist, bekomme ich einige Male eine Sekunde lang wild variieren.

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

Beispiel vom Protokoll, während das 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
War es hilfreich?

Lösung

Ich denke, Ihr Problem ist, dass Sie verwenden int Variablen, wenn Sie möchten float.

Ich denke, die accelerationX und –y sollte Instanzvariablen sein und so:

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

Sollte Ihnen mehr das geben, wonach Sie gesucht haben.

Andere Tipps

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

Versuchen Sie, Folgendes zu tun:

Instanzvariablen deklarieren:

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

...

other declarations

Aktualisieren Sie Variablen im Beschleunigungsmesser -Delegieren:

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

Es sollte genauere Ergebnisse ohne plötzliche Sprünge erzielen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top