Quel est le moyen le plus efficace pour détecter triangle-triangle intersections?
Comment puis-je savoir si deux triangles se coupent en 2D de l'espace Euclidien? (c'est à dire classique de géométrie 2D) compte tenu de l' (X,Y) les coordonnées de chaque sommet de chaque triangle.
- Re vraiment plus efficace algorithme, il n'y a pas eu beaucoup de travail effectué sur cette question, personne n'a montré de façon décisive dont la variation est la plus rapide. Un des problèmes est que beaucoup de la discussion implique tris dans l'espace 3D. Par exemple realtimecollisiondetection.net/blog/?p=29 PS de Tels problèmes sont souvent exprimés en termes de points sur le "bon côté" d'un segment de ligne. Par exemple mochima.com/articles/cuj_geometry_article/... Comme Nick le souligne dans son dernier paragraphe, dans la pratique, il est tout au sujet de la façon dont bon vous ne l'abattage.
Vous devez vous connecter pour publier un commentaire.
Une façon est de vérifier si deux côtés d'un triangle, d'Un se croisent avec un des côtés du triangle B, puis vérifier tous les six possibilités d'un point à l'intérieur d'Un B ou d'un point de B à l'intérieur de A.
Pour un point à l'intérieur d'un triangle voir par exemple: Point dans le triangle d'essai.
Lorsque l'on teste les collisions sur les polygones nous avons aussi un rectangle entourant de nos polygones. Nous avons donc d'abord tester rectangle collisions et si il y a un frappé nous procédons à un polygone de détection de collision.
Python de mise en œuvre de ligne d'intersection et point dans le triangle d'essai, avec un peu de modification.
Il y a plein interactive démo.
t1 = [[0,0],[5,0],[0,5]]; t2 = [[-10,0],[-5,0],[-1,6]]; print (tri_intersect2(t1, t2), False)
line_intersect2
.Voici ma tentative de le triangle-triangle de collision problème (mis en œuvre en python):
Il fonctionne appuie sur le fait que les triangles ne se chevauchent pas si tous les points du triangle 1 sont sur le côté externe d'au moins l'un des bords du triangle 2 (ou vice-versa est vrai). Bien sûr, les triangles ne sont jamais concave.
Je ne sais pas si cette approche est plus ou moins efficace que les autres.
Bonus: je l'ai porté sous C++ https://gist.github.com/TimSC/5ba18ae21c4459275f90
Comme indiqué, vous aurez besoin de vérifier qu'un point est à l'intérieur d'un triangle. La façon la plus simple pour vérifier si un point est à l'intérieur d'un polygone fermé est de tracer une ligne droite dans toutes les directions à partir du point et de compter le nombre de fois que la ligne traverse un sommet. Si la réponse est impair, alors le point est dans le polygone, même, puis c'est à l'extérieur.
Le plus simple ligne droite à vérifier est celle qui va à l'horizontale à droite du point (ou une autre direction perpendiculaire). Cela rend le chèque pour le sommet de passage presque trivial. Les contrôles suivants doivent suffire:
Est le point de coordonnée entre
les coordonnées y de la les deux la fin
points de le vertex? Non, alors
ne pas traverser.
Est le point d'abscisse supérieure à la plus éloignée de droite le point de fin de
le vertex? Oui, puis n'est-ce pas la croix.
Est le point de coordonnée x de moins que le plus à gauche le point final du sommet? Oui, alors ne la croix.
Si le cas ci-dessus échouent, alors vous pouvez
utiliser le produit vectoriel du vecteur
représentant le sommet et un vecteur
formé à partir de la fin du sommet de
le point. Une réponse négative indique le point se trouve sur un côté du vertex, une réponse positive de l'autre côté du sommet, et un zéro réponse sur le vertex. Cela fonctionne parce qu'un produit croisé consiste à prendre le sinus de deux vecteurs.
Ce que vous êtes vraiment à la recherche d'un "Point dans le Polygone" de l'algorithme. Si l'un des points d'un triangle sont dans l'autre, ils sont sécants. Voici une bonne question pour vérifier.
Comment puis-je déterminer si un 2D Point est à l'intérieur d'un Polygone?