Więc stworzyłem tę odgórną grę 2D Java w tej strukturze o nazwie Greenfoot i pracowałem nad sztuczną inteligencją dla facetów, z którymi będziesz walczył. Chcę, aby mogły one realistycznie przemieszczać się po świecie, więc wkrótce zdałem sobie sprawę, że między innymi potrzebuję jakiegoś rodzaju znalezienia ścieżki.
Zrobiłem dwa prototypy A *. Jeden jest oparty na siatce, a potem stworzyłem taki, który działa z punktami trasy, więc teraz muszę znaleźć sposób, aby przejść z „mapy” przeszkód / budynków na 2D do wykresu węzłów, z którego mogę zrobić ścieżkę. Rzeczywiste wyszukiwanie ścieżek wydaje się być w porządku, tylko moje otwarte i zamknięte listy mogłyby użyć bardziej wydajnej struktury danych, ale przejdę do tego, kiedy i kiedy będę tego potrzebować.
Zamierzam użyć siatki nawigacyjnej ze wszystkich powodów wymienionych w tym poście na ai-blog.net . Jednak problem, z którym się spotkałem, polega na tym, że to, co A * uważa za najkrótszą ścieżkę od centrów / krawędzi wielokąta, niekoniecznie jest najkrótszą ścieżką, jeśli podróżujesz przez dowolną część węzła. Aby uzyskać lepszy pomysł, możesz zobaczyć pytanie, które zadałem na stosie .
Mam dobrą odpowiedź dotyczącą wykresu widoczności. Od tego czasu kupiłem książkę ( Geometria obliczeniowa: algorytmy i aplikacje ) i czytałem dalej w tym temacie, jednak nadal opowiadam się za siatką nawigacyjną (patrz „ Zarządzanie złożonością ” w notatkach Amita na temat znajdowania ścieżek ). (Na marginesie, być może mógłbym użyć Theta * do przekształcenia wielu punktów na jedną linię prostą, jeśli pierwszy i ostatni nie są zasłonięte. Lub za każdym razem, gdy cofam się, sprawdzaj przedtem punkt na drodze, aby sprawdzić, czy mogę przejść prosto z to do tego)
Tak więc w zasadzie to, czego chcę, to siatka nawigacyjna, w której po przejściu przez algorytm lejkowy (np. Ten z Digesting Duck ) uzyskam prawdziwą najkrótszą ścieżkę, zamiast tej, która jest najkrótszą ścieżką prowadzącą tylko od węzła do węzła, ale nie najkrótsza, biorąc pod uwagę, że można przejść przez niektóre wielokąty i pominąć węzły / krawędzie.
Aha i ja też chcę wiedzieć, jak sugerujesz przechowywanie informacji dotyczących wielokątów. Dla przykładu prototypu waypointa, który stworzyłem, miałem po prostu każdy węzeł jako obiekt i zapisałem listę wszystkich innych węzłów, do których możesz podróżować z tego węzła. Zgaduję, że to nie zadziała z wielokątami? i jak powiedzieć, czy wielokąt jest otwarty / można go przechodzić, czy też jest to obiekt stały? Jak przechowywać, które węzły tworzą wielokąt?
Wreszcie, dla przypomnienia: chcę sam to zaprogramować od zera, mimo że są już dostępne inne rozwiązania i nie zamierzam (ponownie) używać tego kodu w niczym innym niż ta gra, więc to nie ma znaczenia nieuchronnie będzie niskiej jakości.