Détecter quand un iphone a été heurté

Je veux être en mesure de détecter si un iphone a été heurté quelque chose...serait-il préférable d'écouter le gyroscope /accéléromètre et de juger de la façon dont rapidement ses déménagé ou si son déménagé et s'arrêta brusquement.

En fait, comment pourrais-je juger si l'appareil a été déplacé puis s'arrêta brusquement?

Cette réponse, c'est grand, mais dans le sens inverse iOS: déterminer avec Précision l'énergie d'un choc à l'accéléromètre de sortie - il lisse le mouvement, si tout ce que je veux pour détecter un mouvement brusque.

Aussi sont à la fois le Gyroscope et l'Accéléromètre disponibles pour 3GS ?

MIS À JOUR AVEC LE CODE

À partir de l'Apple doc http://developer.apple.com/library/iOS/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/MotionEvents/MotionEvents.html#//apple_ref/doc/uid/TP40009541-CH4-SW26

Isoler Instantanée de Mouvement à partir des Données d'Accélération
Si vous utilisez l'accéléromètre de données pour détecter viens à l'instant de mouvement d'un périphérique, vous devez être en mesure d'isoler les changements soudains dans le mouvement de la constante de l'effet de la gravité. Vous pouvez le faire avec un filtre passe-haut.

Liste 4-6 montre simplifié filtre passe-haut de calcul. Les valeurs de l'accélération de l'événement précédent sont stockés dans le accelX, accelY, et accelZ variables membres de la classe. Cet exemple calcule le filtre passe-bas de la valeur et puis soustrait de la valeur actuelle pour obtenir instantanément la composante de mouvement.

Liste 4-6 Obtenir instantanément la portion de mouvement de l'accéléromètre de données

define kFilteringFactor 0.1

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    //Subtract the low-pass value from the current value to get a simplified high-pass filter
    accelX = acceleration.x - ( (acceleration.x * kFilteringFactor) + (accelX * (1.0 - kFilteringFactor)) );
    accelY = acceleration.y - ( (acceleration.y * kFilteringFactor) + (accelY * (1.0 - kFilteringFactor)) );
    accelZ = acceleration.z - ( (acceleration.z * kFilteringFactor) + (accelZ * (1.0 - kFilteringFactor)) );

   //Use the acceleration data.
}

Comment puis "Utiliser les données d'accélération" à travailler si un instantané mouvement est détecté?

Remarque: Cet exemple est maintenant obsolète comme iOS utilise le CoreMotion frameowork

OriginalL'auteur daidai | 2011-08-04