Generowanie dróg / rzek na 2d mapie sieci

12

To pytanie dla początkujących, ale oto:

Moja mapa to siatka 2d i chcę generować drogi i rzeki. Trasa od punktu początkowego do końcowego nie może być optymalną drogą pod względem liczby płytek. Zamiast tego powinny mieć pewien poziom losowości (tury).

Czy istnieje standardowy algorytm dla tego rodzaju rzeczy?

Twoje zdrowie!

AKTUALIZACJA:

Jest to wynik zabawy z wagami na siatce i zastosowania algorytmu najkrótszej ścieżki (Bellman-Ford) przy użyciu biblioteki jgrapht. W końcu poszedłem z odpowiedzią Donutza.

http://pastebin.com/AGQGK5ik

Markos Fragkakis
źródło
Czy są jakieś przeszkody na mapie?
MichaelHouse
Jeszcze nie, rzeka będzie pierwszą przeszkodą do postawienia.
Markos Fragkakis

Odpowiedzi:

18

Możesz wygenerować optymalną ścieżkę za pomocą A *, a następnie zniekształcić ją z przesunięciem punktu środkowego.

wprowadź opis zdjęcia tutaj

Zapewni to osiągnięcie punktów końcowych i pozwoli w dużym stopniu kontrolować losowość. Na przykład nie losowałbym dróg tak często jak rzek. Jakakolwiek inteligencja buduje drogi, zwykle stara się być optymalna.

Uważaj, aby upewnić się, że jeśli na mapie znajdują się przeszkody, po każdej iteracji sprawdzasz, czy nie przekraczasz tych przeszkód.

Inną metodą byłoby wygenerowanie szumu Perlina po znalezieniu optymalnej ścieżki, a następnie przesunięcie punktów w oparciu o wygenerowany hałas. Na przykład za pomocą tego hałasu:

wprowadź opis zdjęcia tutaj

Następnie pokaż z optymalną ścieżką na czerwono i przesuniętą ścieżką na niebiesko:

wprowadź opis zdjęcia tutaj

Zauważ, jak przesunięta ścieżka „osiadła” w ciemniejszych obszarach hałasu. W ten sam sposób rzeka może przepłynąć przez dolinę.

Jedną z zalet wyboru hałasu Perlin jest to, że możesz uwzględnić przeszkody i unikać ich w ramach algorytmu.

MichaelHouse
źródło
1
Jak robisz to przesunięcie punktu w oparciu o hałas?
Khoi
1
Zależy to od sposobu przechowywania szumu i generowanej linii. Możesz znaleźć najbliższy / najniższy hałas prostopadły do ​​linii w centrum najpierw, a następnie w środkowych punktach między środkiem a końcami i tak dalej.
MichaelHouse
3

Algorytm A * pozwala również przypisywać wartości do kafelków, wskazując ich przydatność. Na przykład, możesz przypisać najniższe koszty do niskich gruntów dla rzek, do płaskich gruntów (ale nie bagien) dla dróg i generować na ich podstawie. Nie zapewnia to najkrótszej trasy, ale zapewnia najbardziej efektywną trasę. Zastosuj trochę losowości do swoich wartości kafelków, aby uzyskać kilka nieoptymalnych tras.

Pączki
źródło
2

A kiedy wysokość jest czynnikiem? Mogę wykonać mapę wysokości z algorytmem kwadratu diamentowego. Myślałem o dodaniu losowej wody do każdego kafelka, a następnie iteracji i przemieszczaniu wody na niższe poziomy, aż wszystko się uspokoi, ale to spowolni i prawdopodobnie stworzy jeziora, a nie rzeki.

Zastanawiałem się też nad normami dla każdej płytki. Jeśli 2 normalne wskazują na siebie, to musi to być dolina. Woda zbierałaby się w dolinie. Jeśli skierują się w tym samym kierunku lub od siebie, woda nie zbierze się. Byłoby to prawdopodobnie szybsze niż metoda iteracji, ale może nie tworzyć jezior, tylko rzeki. Musiałbym się z tym bawić, aby nie zamieniać każdego przypadku płytek skierowanych ku sobie w rzekę.

użytkownik137
źródło
Przeczytałem jeden z dokumentów, w którym możesz dodać wagę do każdej płytki, a niektóre płytki są po prostu nieprzejezdne.
Joe Plante,