Załóżmy, że mają 2D siatka składa się z zachodzących na siebie trójkąty i zbiór punktów { s I } M i = 1 ⊂ ∪ N k = 1 T K . W jaki sposób najlepiej ustalić, w którym trójkącie leży każdy z punktów?
Na przykład na poniższym obrazku mamy , p 2 ∈ T 4 , , więc chciałbym, aby funkcja zwracała listę .
Matlab ma funkcję lokalizacji punktowej, która robi to, co chcę dla siatek Delaunay, ale zawodzi w przypadku siatek ogólnych.
Moją pierwszą (głupią) myślą jest, aby dla wszystkich węzłów przejść przez wszystkie trójkąty, aby dowiedzieć się, w którym trójkącie znajduje się p i . Jest to jednak wyjątkowo nieefektywne - być może trzeba będzie zapętlić każdy trójkąt dla każdego punktu, więc może zająć pracę O ( N ⋅ M ) .
Moją kolejną myślą jest, aby dla wszystkich punktów znaleźć najbliższy węzeł siatki poprzez wyszukiwanie najbliższego sąsiada, a następnie przejrzeć trójkąty dołączone do tego najbliższego węzła. W tym przypadku praca będzie wynosić O ( a ⋅ M ⋅ l o g ( N ) ) , gdzie a jest maksymalną liczbą trójkątów przymocowanych do dowolnego węzła w siatce. Z tym podejściem wiąże się kilka problemów, które można rozwiązać, ale irytujące,
- Wymaga wydajnego wyszukiwania najbliższego sąsiada (lub znalezienia biblioteki, która go posiada), co może być niełatwym zadaniem.
- Wymaga to przechowywania listy trójkątów dołączonych do każdego węzła, dla których mój kod nie jest obecnie skonfigurowany - w tej chwili jest tylko lista współrzędnych węzła i lista elementów.
W sumie wydaje się to nieeleganckie i myślę, że powinien istnieć lepszy sposób. To musi być problem, który często się pojawia, więc zastanawiałem się, czy ktokolwiek mógłby zalecić najlepszy sposób znalezienia trójkątów, w których znajdują się węzły, zarówno teoretycznie, jak i pod względem dostępnych bibliotek.
Dzięki!
Nie jestem przekonany, czy twoje rozwiązanie jest poprawne. Rozważ sytuację, w której masz te węzły:
Istnieją trójkąty ABC i ACD. Teraz B jest najbliższym punktem początkowym, ale początek znajduje się w trójkącie ACD, który nie zawiera B.
Rozważałbym opcję zbudowania kwadratu zawierającego same trójkąty. Tzn. Masz drzewo czwartorzędowe, które przechowuje w każdym węźle (co odpowiada obwiedni):
źródło
CGAL obsługuje triangulacje i lokalizację punktu (i wiele więcej). W szczególności moduł triangulacji 2D może robić, co chcesz.
źródło