2009-06-16 4 views
5

Je souhaite détecter l'orientation de l'iPhone par incréments de 45 degrés. Idéalement, j'aimerais pouvoir obtenir l'angle d'orientation le long d'un axe.Détecter l'orientation de l'écran de l'iPhone

La détection que je dois faire est similaire à la façon dont Trism pour l'iPhone clignote une flèche vers la position inférieure actuelle de l'écran lorsque l'orientation change.

J'ai quelque chose de codé mais je ne comprends vraiment pas comment les lectures de l'accéléromètre fonctionnent et pourrait utiliser un coup de pouce dans la bonne direction. Mon code actuel enregistre l'angle actuel, mais même lorsque le téléphone est à plat, les lectures varient énormément quelques fois par seconde.

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

Extrait du journal lorsque le téléphone est à plat:

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 

Répondre

4

Je pense que votre problème est que vous utilisez int des variables lorsque vous voulez float.

Je pense que le accelerationX et -Y devrait être exemple des variables et donc:

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

devrait vous donner plus ce que vous recherchez.

+0

Merci pour votre réponse, j'ai changé le code pour utiliser floats inead, mais je reçois toujours le résultat de valeurs follement fluctuantes qui sont calculées lorsque l'appareil est à plat. – Simon

+0

Ajout de quelques lignes du journal à la question. – Simon

+0

Ah, manqué votre commentaire la première fois en ce qui concerne les variables d'instance, on dirait que cela pourrait être la solution, vous reviendrons. – Simon

3

La raison est que vous utilisez des variables locales, alors qu'elles ne devraient pas être locales.

Essayez de faire ce qui suit:

Déclarez les variables d'instance:

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

... 

other declarations 

des variables de mise à jour délèguent accéléromètre:

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

Il devrait donner des résultats plus précis, sans sauts brusques.

Questions connexes