Jednym z rozwiązań jest podzielenie wklęsłego wielokąta na wypukłe segmenty, a następnie użycie linku cobbal.
Ponieważ naprawdę masz dwa różne podstawowe problemy, czy rozważałeś inne alternatywy dla problemu testu trafienia, na przykład używając drzewa BSP? Możesz przyspieszyć to jeszcze bardziej, układając siatkę ponad polem i budując drzewo BSP dla każdego kwadratu siatki. Lub drzewo kd z najwyżej jedną krawędzią w każdym liściu?
Edit: będę ellaborate na kd-drzewa (z nudów, nawet jeśli może to być dowolnego użytku dla nikogo):
kd-drzewa mają następujące właściwości:
- Są one binarne
- Każdy nie-liść węzłowy dzieli przestrzeń wzdłuż płaszczyzny prostopadłej do osi, z jednej strony na dziecko. Na przykład. root dzieli przestrzeń na x < x0 i x> = x0
- Poziomy drzew z kolei dzielą się na różne osie, np. poziom 0 (root) dzieli prostopadle X, Poziom 1 -> Y, itd
Aby użyć tego wielokąta uderza detekcję skonstruować drzewo w następujący sposób:
- Odbiór wierzchołek podzielić wzdłuż. (Leprably gdzieś blisko środka dla zrównoważonego drzewa).
- Podziel pozostałe wierzchołki na dwa zestawy, po jednym dla każdej strony podziału. Powyższy wierzchołek nie przechodzi do żadnego z zestawów.
- Umieść krawędzie w zestawach. Każda krawędź, która przecina linię podziału, przechodzi do obu zbiorów.
- Skonstruuj dzieci rekurencyjnie z powyższych grup.
Jeśli podzielony wierzchołek zostanie wybrany odpowiednio, drzewo powinno mieć głębokość zbliżoną do log (N), gdzie N jest liczbą wierzchołków. Każdy węzeł liści będzie miał co najwyżej jedną krawędź przechodzącą przez niego. Aby wykryć trafienie:
- Znajdź liść, w którym znajduje się punkt.
- Jeśli w liściu jest krawędź, porównaj z nią punkt. Jeśli nie, powinno być oczywiste, czy punkt jest wewnątrz czy na zewnątrz (przechowuj tę informację w takich liściach podczas konstruowania drzewa).
Czy uważasz, że test "punkt w wielokąt" jest ciężki? Przez większość czasu jest to tylko "większy niż" i/lub "mniej niż" test wszystkich punktów, z których składa się wielokąt, a tylko w niektórych przypadkach test przecięcia linii. Lub...? –
Nie jestem pewien, co masz na myśli ... Używam testu "parzysty-nieparzysty" dla połowy linii (po sprawdzeniu prostokąta ograniczającego oczywiście). To kończy się testowaniem wielu stron, a jeśli wielokąt ma wiele stron, jest dość wolny. –
Coud link do niektórych zestawów danych, brzmi to jak coś, co może być zabawne, aby spróbować. –