Question

Je suis désireux de détecter l'orientation de l'iPhone à incréments de 45 degrés. Idéalement, je voudrais être en mesure d'obtenir l'angle d'orientation le long d'un axe quelconque.

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

J'ai quelque chose codé jusqu'à, mais vraiment ne comprends pas comment les lectures de l'accéléromètre et le travail pourrait utiliser un coup de coude dans la bonne direction. Mon code actuel enregistre l'angle actuel, mais même lorsque le téléphone est à plat je reçois des lectures différentes d'une manière extravagante 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);
}

Exemple de 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
Était-ce utile?

La solution

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

Je pense que le accelerationX et -Y devraient être variables d'instance et donc:

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

Pourquoi devriez-vous donner plus de ce que vous recherchez.

Autres conseils

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

Essayez de faire ce qui suit:

Déclarer les variables d'instance:

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

...

other declarations

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top