Comment puis-je savoir si un chemin fermé contient un point donné?
Dans Android, j'ai un Chemin d'accès de l'objet qui, je sais, définit un chemin fermé, et j'ai besoin de comprendre si un point est contenu dans le chemin. Ce que j'espérais était quelque chose le long des lignes de
chemin.contient(int x, int y)
mais qui ne semblent pas exister.
La raison spécifique pour laquelle je suis à la recherche pour cela est parce que j'ai une collection de formes à l'écran définis comme des chemins, et je veux comprendre lequel l'utilisateur a cliqué. Si il ya une meilleure façon d'approcher, comme l'utilisation de différents éléments de l'INTERFACE utilisateur, plutôt que de le faire "à la dure" moi, je suis ouvert aux suggestions.
Je suis ouvert à l'écriture d'un algorithme de moi-même si je dois le faire, mais cela signifie que les différentes recherches, je suppose.
source d'informationauteur Tom Seago
Vous devez vous connecter pour publier un commentaire.
La
android.graphics.Path
classe ne dispose pas d'une telle méthode. La classe Canvas dispose d'une zone de capture qui peut être définie sur un chemin, il n'y a aucun moyen de le tester contre un point. Vous pouvez essayer de Toile.quickReject, les essais contre un seul point rectangle (ou un 1x1Rect
). Je ne sais pas si ce serait vraiment contre-vérifier le chemin d'accès ou tout simplement le rectangle d'encadrement.La Région de la classe clairement ne garde la trace de l'contenant rectangle.
Vous pourriez envisager d'appeler chacune de vos régions dans un 8-bit alpha calque Bitmap avec chaque
Path
rempli de sa propre "couleur" de la valeur (assurez-vous que l'anti-aliasing est désactivé dans votrePaint
). Cela crée une sorte de masque pour chaque chemin rempli avec un index pour le chemin qui l'a rempli. Ensuite, vous pouvez simplement utiliser la valeur du pixel comme un indice dans votre liste de chemins d'accès.Alors chercher des points,
Assurez-vous de vérifier 255 (pas de sentier) si il ne sont pas pourvus de points.
Voici ce que j'ai fait et il semble fonctionner:
Maintenant, vous pouvez utiliser le
region.contains(x,y)
méthode.** Mise à jour sur 6/7/2010 **
La région.setPath méthode sera la cause de mon appli crash (pas de message d'avertissement) si le rectF est trop grand. Voici ma solution:
WebKit est SkiaUtils a un C++ de travail autour de Randy Findley du bug:
Je sais que je suis un peu en retard à la fête, mais je voudrais résoudre ce problème en pensant à elle comme de déterminer si un point est dans un polygone.
http://en.wikipedia.org/wiki/Point_in_polygon
Le calcul calcule plus lentement lorsque vous êtes à la recherche à des courbes de Bézier au lieu de segments de ligne, mais le dessin d'un rayon à partir du point de fonctionnement.
Pour être complet, je tiens à formuler quelques remarques ici:
Comme de l'API 19, il y a un intersection de l'opération pour les Chemins. Vous pouvez créer une très petite place chemin autour de votre point de test, intersection avec le Chemin d'accès, et de voir si le résultat est vide ou pas.
Vous pouvez convertir les Chemins de Régions et de faire un contient() opération. Cependant Régions travaillent en entier coordonnées, et je pense qu'ils utilisent transformé (en pixels) de coordonnées, de sorte que vous aurez à travailler avec. Je pense aussi que le processus de conversion est de calcul intensif.
Le bord de passage de l'algorithme de Hans posté est bon et rapide, mais vous devez être très prudent pour certains cas particuliers tels que lorsque le rayon passe directement par un sommet, ou coupe un bord horizontal, ou lorsque l'erreur d'arrondi est un problème qu'il l'est toujours.
La numéro du bobinage méthode est à peu près infaillible, mais implique beaucoup de trig et est gourmand en ressources.
Ce papier par Dan, dimanche donne un algorithme hybride qui est aussi précis que le numéro du bobinage mais comme calcul simple que le ray-casting de l'algorithme. Il m'a coupé le souffle son élégance.
Voir https://stackoverflow.com/a/33974251/338479 pour mon code qui permettra de faire le point-in-calcul du chemin pour un chemin constitué de segments de lignes, des arcs et des cercles.