mercredi 15 février 2012

Détecter un geste Cercle

In Début de développement iPhone, Nous avons un chapitre sur les gestes. Alors je pense que nous avons couvert le sujet assez bien, j'aurais aimé avoir inclus quelques gestes plus personnalisée dans ce chapitre. En ce moment, par écrit, cependant, nous étions déjà sur le passage sur le nombre de pages. À l'époque, nous avons aussi tout simplement pas avoir une bonne idée de ce que d'autres gestes qui deviennent communs.

Je n'ai expérimentation certaines avec détection des cercles à l'époque, mais ne comprend pas le code dans le livre pour deux raisons. Une des raisons est parce que la méthode est vraiment très long et aurait pris beaucoup d'explications, que nous n'avons pas vraiment eu de rechange pour les pages. Les raisons seconde est que j'ai le sentiment qu'il ya un moyen beaucoup plus facile et plus efficace d'aller sur la détection d'un geste cercle. Parce que vous avez besoin pour construire une certaine tolérance dans la détection de geste, je ne suis pas sûr qu'il y est, mais il ya au moins une chance décente il ya de meilleures façons de détecter un cercle.

Mais, depuis une recherche Google ne se sont pas tous des exemples de code là-bas pour ce faire, j'ai décidé de mettre à jour le code et l'afficher.

S'il vous plaît, si vous voyez un moyen plus facile de faire cela et que vous voulez le souligner, par tous les moyens, allez-y.

Vous pouvez télécharger l'exemple de projet droit here.

L'exemple d'application est très basique, il retrace simplement la forme que vous dessinez et vous indique qu'il a détecté soit un cercle, ou vous dit pourquoi il ne pense pas que la forme qui compte comme un cercle. Je n'ai pas encapsulé ce soit réutilisable (encore, au moins), mais la technique est assez autonome, nécessitant seulement trois variables d'instance et dominante de trois des méthodes de manipulation tactile. Dans l'échantillon, le code tactile manipulation est dans la sous-vue, ce qui rendait plus facile de faire le dessin, mais la touche de gestion doit travailler dans une classe de contrôleur de vue aussi bien.

circle.jpg


Voici une description de base de l'algorithme que j'ai utilisé. Vous pouvez télécharger le code pour voir l'implémentation exacte.


  1. En touchesBegan: withEvent: stocker le point où le premier utilisateur tapé sur l'écran

  2. En touchesMoved: withEvent: stocker hors chaque point de contact supplémentaire qui vient, de les stocker dans l'ordre

  3. dans touchesEnded: withEvent:, stocker le point final, puis de faire un certain nombre de vérifications, de faire les calculs les moins chers afin d'éviter d'avoir à effectuer les calculs les plus chères en écartant évidente non-cercles. La plupart de ces contrôles sont basés sur une variance ou un seuil défini dans une constante:

    1. Si le point final est trop loin du point de départ, ce n'est pas un cercle.

    2. Si l'opération de dessin a pris plus de deux secondes, ce n'est pas un cercle. Bon, il pourrait être un cercle, mais si c'est trop long, ce n'est probablement pas un geste intentionnel. Vous pouvez supprimer ce chèque si vous ne le voulez pas.

    3. S'il n'y a pas un certain nombre de points stockés, il ne peut pas être un cercle. Ceci afin d'éviter les faux positifs des robinets persistante.

    4. Boucle à travers la touche stockées et de déterminer le plus haut, le bas-plus, plus à gauche et à droite la plupart des points, et l'utiliser pour déterminer un centre approximatif et un rayon moyen approximatif.

    5. Boucle à travers les points stockés dans l'ordre, en veillant à:

      1. Chaque point de la distance depuis le centre est dans une certaine variance du rayon moyen approximatif.

      2. C'est l'angle formé par le point de départ, au rayon, au point courant circule dans un ordre naturel. L'angle doit constamment augmenter ou diminuer. Si elle ne va pas dans l'ordre, alors il s'agit probablement d'une forme plus complexe que d'un cercle.





Comme je l'ai indiqué précédemment, il ya probablement un moyen plus simple, plus précis pour détecter un cercle, mais jusqu'à ce que l'on vient à la lumière, c'est au moins fonctionnel.

Aucun commentaire: