Pembuatan jalan / sungai pada peta grid 2d


12

Ini adalah pertanyaan pemula, tapi begini:

Peta saya adalah grid 2d, dan saya ingin menghasilkan jalan dan sungai. Rute dari titik awal hingga akhir tidak boleh menjadi rute optimal dalam jumlah ubin. Sebaliknya, mereka harus memiliki tingkat keacakan (putaran) tertentu.

Apakah ada algoritma standar untuk hal semacam ini?

Bersulang!

MEMPERBARUI:

Ini adalah hasil dari bermain dengan beban di grid, dan menerapkan algoritma jalur terpendek (Bellman-Ford) menggunakan perpustakaan jgrapht. Aku pergi dengan jawaban Donutz.

http://pastebin.com/AGQGK5ik


Apakah ada kendala di peta?
MichaelHouse

Belum, sungai akan menjadi hambatan pertama yang ditempatkan.
Markos Fragkakis

Jawaban:


18

Anda dapat membuat jalur optimal menggunakan A *, lalu mengubahnya dengan perpindahan titik tengah.

masukkan deskripsi gambar di sini

Ini akan memastikan titik akhir Anda terpenuhi dan memungkinkan Anda untuk mengontrol keacakan secara besar-besaran. Sebagai contoh, saya tidak akan mengacak jalan sebanyak sungai. Kecerdasan apa pun yang membangun jalan biasanya berupaya untuk mengoptimalkannya.

Berhati-hatilah untuk memastikan bahwa jika peta Anda memiliki hambatan, Anda mengecek setelah setiap iterasi bahwa Anda tidak melewati rintangan itu.

Metode lain adalah menghasilkan Perlin noise setelah menemukan jalur yang optimal, kemudian menggeser poin Anda berdasarkan kebisingan yang dihasilkan. Misalnya, menggunakan noise ini:

masukkan deskripsi gambar di sini

Kemudian perlihatkan dengan jalur optimal berwarna merah dan jalur bergeser berwarna biru:

masukkan deskripsi gambar di sini

Perhatikan bagaimana jalur yang bergeser telah "menetap" ke area yang lebih gelap dari kebisingan. Dengan cara yang sama sungai mungkin mengalir melalui lembah.

Salah satu manfaat dari pilihan kebisingan Perlin adalah Anda dapat memperhitungkan kendala dan menghindarinya sebagai bagian dari algoritma.


1
Bagaimana Anda melakukan ini dengan menggeser titik berdasarkan kebisingan?
Khoi

1
Itu tergantung pada bagaimana Anda menyimpan suara dan menghasilkan garis. Anda dapat menemukan noise terdekat / terendah yang tegak lurus terhadap garis di tengah terlebih dahulu, kemudian pada titik tengah antara tengah dan ujung, dan seterusnya.
MichaelHouse

3

Algoritma A * juga akan memungkinkan Anda untuk menetapkan nilai ke ubin yang menunjukkan kesesuaiannya. Misalnya, Anda dapat menetapkan skor biaya terendah untuk lahan rendah untuk sungai, ke tanah datar (tetapi bukan rawa) untuk jalan, dan menghasilkan berdasarkan itu. Ini tidak memberi Anda rute terpendek, tetapi itu memberi Anda rute yang paling efisien. Terapkan sedikit keacakan nilai ubin Anda dan Anda bisa mendapatkan beberapa rute sub-optimal.


2

Bagaimana dengan ketika tinggi adalah faktor? Saya dapat membuat peta ketinggian dengan algoritma berlian persegi. Saya berpikir untuk menambahkan air acak ke setiap ubin dan kemudian beralih dan memindahkan air ke ketinggian yang lebih rendah sampai semuanya beres, tetapi itu akan melambat, dan mungkin akan membuat danau, bukan sungai.

Saya juga berpikir untuk melihat normals untuk setiap ubin. Jika 2 normals menunjuk satu sama lain, maka itu pasti sebuah lembah. Air akan terkumpul di sebuah lembah. Jika mereka menunjuk ke arah yang sama atau jauh dari satu sama lain, air tidak akan mengumpulkan. Ini mungkin akan lebih cepat daripada metode iterasi, tetapi mungkin tidak membuat danau, hanya sungai. Saya harus bermain-main dengannya agar tidak mengubah setiap contoh ubin menunjuk satu sama lain menjadi sungai.


Saya membaca salah satu dokumen di mana Anda dapat menambahkan bobot ke setiap ubin, ditambah ubin tertentu tidak bisa dilewati.
Joe Plante
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.