Domanda

Sono voler rilevare l'orientamento di iPhone a incrementi di 45 gradi. Idealmente mi piacerebbe essere in grado di ottenere l'angolo di orientamento lungo un asse.

La rilevazione che devo fare è simile al modo Trism per l'iPhone lampeggia una freccia verso la posizione di fondo corrente dello schermo quando cambia l'orientamento.

Ho qualcosa codificato su ma davvero non capisco come l'accelerometro letture di lavoro e potrebbe utilizzare una spintarella nella giusta direzione. Il mio codice corrente registra l'angolo corrente, ma anche quando il telefono è piatta ottengo letture che variano selvaggiamente un paio di volte al secondo.

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

Esempio di registro quando il telefono è piatta:

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
È stato utile?

Soluzione

Credo che il problema è che si sta utilizzando le variabili int quando si vuole float.

Credo che la accelerationX e -Y dovrebbero essere variabili di istanza e quindi:

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

Dovrebbe dare più quello che stavi cercando.

Altri suggerimenti

Il motivo è che si sta utilizzando le variabili locali, mentre non dovrebbero essere locali.

Prova a fare quanto segue:

Dichiarare le variabili di istanza:

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

...

other declarations

variabili Update in accelerometro delegato:

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

Si dovrebbe dare risultati più precisi, senza salti improvvisi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top