Генерація доріг / річок на 2d мапі сітки


12

Це питання для новачків, але тут йдеться:

Моя карта - це 2d сітка, і я хочу створити дороги та річки. Маршрут від початкової до кінцевої точки не повинен бути оптимальним маршрутом за кількістю плиток. Натомість вони повинні мати певний рівень випадковості (поворотів).

Чи існує стандартний алгоритм для подібних речей?

Ура!

ОНОВЛЕННЯ:

Це результат гри з вагами на сітці та застосування алгоритму найкоротшого шляху (Bellman-Ford) за допомогою бібліотеки jgrapht. Зрештою, я пішов з відповіддю Пончика.

http://pastebin.com/AGQGK5ik


Чи є на карті перешкоди?
MichaelHouse

Поки що річка стане першою перешкодою, яку потрібно поставити.
Markos Fragkakis

Відповіді:


18

Ви можете створити оптимальний шлях за допомогою A *, а потім спотворити його з переміщенням середньої точки.

введіть тут опис зображення

Це забезпечить дотримання ваших кінцевих точок та дозволить значно контролювати випадковість. Наприклад, я б не рандомізував дороги настільки, як річки. Яка б інтелект не будувала дороги, зазвичай намагається бути оптимальним щодо цього.

Слідкуйте за тим, щоб на вашій карті були перешкоди, після кожної ітерації ви перевіряєте, чи не переходите ви через ці перешкоди.

Іншим методом було б генерувати шум Перліна після знаходження оптимального шляху, а потім зміщувати точки на основі отриманого шуму. Наприклад, використовуючи цей шум:

введіть тут опис зображення

Потім покажіть оптимальну стежку червоним кольором і зміщену стежку синім кольором:

введіть тут опис зображення

Зауважте, як зміщена стежка «оселилася» у темніші місця шуму. Таким же чином річка може протікати через долину.

Однією з переваг вибору шуму Perlin є те, що ви можете враховувати свої перешкоди та уникати їх як частини алгоритму.


1
Як ви робите цю базу зсуву точки на шум?
Хой

1
Це залежить від того, як ви зберігаєте шум та згенеровану лінію. Ви могли спочатку знайти найближчий / найнижчий шум, перпендикулярний до лінії в центрі, потім у середніх точках між центром та кінцями тощо.
MichaelHouse

3

Алгоритм A * також дозволить призначити значення плиткам із зазначенням їх придатності. Наприклад, ви можете призначити найнижчі показники витрат низькій землі для річок, рівнинній землі (але не болоті) для доріг, і генерувати на основі цього. Це не дає вам найкоротший маршрут, але він дає вам найбільш ефективний маршрут. Застосуйте трохи випадковості до значень плитки, і ви зможете отримати деякі неоптимальні маршрути.


2

А як щодо того, коли висота є фактором? Я можу зробити мапу висоти за допомогою алмазного квадратного алгоритму. Я думав додати трохи випадкової води до кожної черепиці, а потім перебирати і переміщувати воду до нижчих висот, поки все не оселиться, але це сповільниться, і, мабуть, зробить озера, а не річки.

Я також думав подивитися на нормали для кожної плитки. Якщо 2 нормалі вказують один на одного, то це повинна бути долина. Вода збиралася б у долині. Якщо вони вказують в одному напрямку або вдалині один від одного, вода не збирається. Це, мабуть, буде швидше, ніж метод ітерації, але може не зробити озера, а лише річки. Мені доведеться пограти з нею, щоб не перетворювати кожен екземпляр плитки на бік річки.


Я прочитав один з документів, де можна додати вагу до кожної плитки, плюс певні плитки просто непрохідні.
Джо Плант
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.