2009-08-22 7 views

Répondre

0

Note: Cette réponse est une version antérieure de la question, où je pensais que le problème était de déterminer si le chemin était fermé ou non.

Je pense qu'un chemin est considéré fermé si le point actuel == le point de départ. Le moyen le plus simple que je connaisse pour vérifier ceci est de garder une trace de ces deux points par vous-même, et de vérifier l'égalité. Vous pouvez également utiliser CGPathGetCurrentPoint, et suivre uniquement le point de départ pour comparer avec cela.

est ici un moyen de rond-point pour trouver le point de départ, s'il est difficile de simplement garder une trace de celui-ci directement:

  • faire une copie du chemin
  • magasin son point actuel
  • appel CGPathCloseSubpath
  • vérifier pour voir si le point courant a changé

Si elle a changé, le chemin d'origine était op en; sinon fermé.

+0

Désolé je n'étais pas clair ... J'ai essayé cela mais parfois le contact de l'utilisateur croisera le chemin et il devrait alors être fermé.J'ai essayé de comparer à tous les points dans le chemin, mais beaucoup d'entre eux ont une distance de quelques pixels entre eux. –

2

Graham Cox a quelques very interesting thoughts sur la façon de détecter l'intersection d'un CGPathRef et un CGRect, ce qui est similaire à votre problème et peut être éducatif. Le problème sous-jacent est difficile et la plupart des solutions pratiques vont être des approximations.

Vous pouvez également regarder cet article SO sur CGPathRef intersection, ce qui est aussi simliar à votre problème, et certaines des solutions proposées sont dans le même espace que Graham ci-dessus.

+0

Merci ... J'ai essayé la détection de collision par pixel mais c'est trop sensible. Un mouvement diagonal parfois alias déclenchera une "collision". –

0

Ceci est un moyen de vérifier si un chemin composé d'un seul segment continu s'auto-intersecte.

Je suis sûr que si vous vouliez une implémentation plus rapide, vous pourriez en obtenir un en utilisant une bonne réflexion et un accès complet aux données internes CGPath. Cette idée se concentre sur le codage rapide, bien que je soupçonne qu'il sera encore assez rapide:

Fondamentalement, prenez deux copies du chemin, et remplissez-le de deux manières différentes. Un remplissage utilise CGContextEOFillPath, tandis que l'autre utilise CGContextFillPath. Les résultats seront différents si le chemin est auto-croisé.

Vous pouvez vérifier si le résultat est différent en mélangeant les résultats ensemble dans difference blend mode, et en testant si les données d'image brutes résultantes sont toutes 0 (toutes en noir).

Hacky, oui. Mais aussi (relativement) facile à coder.

** Addendum ** Je viens de me rendre compte que cela ne fonctionnera pas 100% du temps - par exemple, il ne détectera pas un chiffre huit, bien qu'il détectera un bretzel.

+0

Merci pour la réponse. J'ai essayé cela mais j'ai du mal à utiliser CGContextFillPath/CGContextEOFillPath sur des chemins séparés dans un CGBitmapContext. Devrais-je les classer avec la couleur blanche ou noire? –

Questions connexes