Mam 2 wielokąty. Znam współrzędne wierzchołków obu wielokątów. Jaki jest najlepszy sposób, aby sprawdzić, czy jedno jest całkowicie wewnątrz drugiego? Na przykład algorytm powinien rozpoznać tylko czarny trapez poniżej jako zawarty:
collision-detection
vector
geometry
użytkownik960567
źródło
źródło
Odpowiedzi:
Istnieje mnóstwo fragmentów kodu źródłowego dla metody, która wykonuje test „ punktu wewnątrz wielokąta ”. Zasada ta pochodzi z twierdzenia Jordana o wielobokach ( http://www-cgrl.cs.mcgill.ca/~godfried/teaching/cg-projects/97/Octavian/compgeom.html ).
Naiwnym sposobem byłoby: mając tę metodę, nazwij ją
PointInsidePolygon(Point p, Polygon poly)
:Teoretycznie nie powinno zabraknąć żadnego scenariusza dla twoich wielokątów, ale nie jest to optymalne rozwiązanie.
Uwagi „Edge”
PointInsidePolygon(..)
musi zwracać wartość true, jeśli punkt znajduje się na granicy wielokąta (albo leży na krawędzi, albo jest wierzchołkiem)EdgesIntersect(..)
musi zwrócić false, jeśliinnerEdge
jest podzbiorem (geometrycznie) zouterEdge
. W tym przypadku krawędzie oczywiście przecinają się, ale dla celów algorytmu musimy wskazać, że przecięcie nie łamie semantyki zaisInside
zmiennąOgólne Remakrs :
bez sprawdzania przecięcia krawędzi względem krawędzi, jak wskazano w komentarzach, podejście może zwrócić fałszywie dodatnie wyniki dla niektórych wklęsłych wielokątów (np. kwadratu w kształcie litery V i prostokąta - prostokąt może mieć wszystkie wierzchołki wewnątrz kształtu V, ale przeciąć go , mając w ten sposób przynajmniej niektóre obszary na zewnątrz).
po sprawdzeniu, czy przynajmniej jeden z wierzchołków wielokąta wewnętrznego znajduje się wewnątrz zewnętrznego, a jeśli nie ma przecinających się krawędzi, oznacza to, że poszukiwany warunek jest spełniony.
źródło
Spróbuj wykonać przecięcie linii z każdą czerwoną linią. W pseudokodzie:
Jednak, jak widać, to rozwiązanie będzie działać wolniej, gdy dodasz więcej wielokątów do sprawdzenia. Innym rozwiązaniem może być:
To rozwiązanie jest bardzo szybkie, ale zależy od Twojej implementacji (i tego, co chcesz zrobić z wynikiem sprawdzenia), które rozwiązanie będzie dla Ciebie najlepsze.
źródło