J'ai 2 polygones. Je connais les coordonnées des sommets des deux polygones. Quelle est la meilleure façon de vérifier si l'un est complètement à l'intérieur de l'autre? Par exemple, l'algorithme ne doit reconnaître que le trapèze noir ci-dessous comme contenu:
collision-detection
vector
geometry
user960567
la source
la source
Réponses:
Il existe des tonnes d'extraits de source pour une méthode qui effectue un test de " point à l'intérieur du polygone ". Le principe provient du théorème de courbe de Jordan pour les polygones ( http://www-cgrl.cs.mcgill.ca/~godfried/teaching/cg-projects/97/Octavian/compgeom.html ).
La manière naïve serait: avoir cette méthode, appelez-la
PointInsidePolygon(Point p, Polygon poly)
:Théoriquement, il ne devrait manquer aucun scénario pour vos polygones, mais ce n'est pas la solution optimale.
Remarques sur l'affaire "Edge"
PointInsidePolygon(..)
doit renvoyer true si le point est sur la bordure du polygone (soit se trouve sur une arête, soit est un sommet)EdgesIntersect(..)
doit renvoyer false si leinnerEdge
est un sous-ensemble (géométriquement) deouterEdge
. Dans ce cas, les bords se coupent évidemment, mais pour les besoins de l'algorithme, nous devons indiquer que l'intersection ne rompt pas la sémantique derrière laisInside
variableGénéral Remakrs :
sans vérification de l'intersection arête contre arête, comme indiqué dans les commentaires, l'approche peut renvoyer des faux positifs pour certains polygones concaves (par exemple un quadrilatère en forme de V et un rectangle - le rectangle peut avoir tous ses sommets à l'intérieur de la forme en V, mais l'intersecter). , ayant ainsi au moins quelques zones à l'extérieur).
après avoir vérifié qu'au moins l'un des sommets du polygone intérieur se trouve à l'intérieur de celui extérieur, et s'il n'y a pas d'arêtes qui se croisent, cela signifie que la condition recherchée est satisfaite.
la source
Essayez de faire une intersection de lignes avec chaque ligne rouge. En pseudocode:
Cependant, comme vous pouvez le voir, cette solution deviendra plus lente lorsque vous ajouterez plus de polygones à vérifier. Une solution différente pourrait être:
Cette solution est très rapide, mais cela dépend de votre implémentation (et de ce que vous voulez faire avec le résultat de votre vérification) quelle solution vous convient le mieux.
la source