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.
Jawaban:
Anda dapat membuat jalur optimal menggunakan A *, lalu mengubahnya dengan perpindahan titik tengah.
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:
Kemudian perlihatkan dengan jalur optimal berwarna merah dan jalur bergeser berwarna biru:
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.
sumber
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.
sumber
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.
sumber