Hasilkan daerah yang sama dalam peta hex

13

Sebagai contoh mengambil peta hex besar (X oleh Y), bagaimana saya bisa membaginya menjadi N wilayah heks terhubung untuk mensimulasikan negara?

Tujuannya adalah untuk menghasilkan peta hex yang terlihat seperti peta kehidupan nyata dengan negara-negara dengan bentuk yang berbeda tetapi ukurannya sama.

MadCatPT
sumber

Jawaban:

13

Sudahkah Anda mencoba Algoritma Lloyd ? Prosedurnya cukup sederhana, dan akan menghasilkan daerah tampak cukup teratur (tergantung pada berapa banyak iterasi yang Anda jalankan).

  1. Ubin peta dengan heksa kosong untuk memulai.
  2. Pilih N hexes secara acak. Ini akan mewakili "pusat massa" untuk setiap negara.
  3. Tandai setiap hex dengan hex tengah yang paling dekat dengan ( Diagram Voronoi ). Negara i adalah himpunan semua heks terdekat dengan heks pusat i'th .
  4. Hitung pusat massa baru untuk setiap negara.
  5. Ulangi langkah 3 dan 4 sebanyak yang Anda inginkan untuk menghaluskan daerah yang dihasilkan.

Anda tidak harus menjalankannya terlalu lama untuk menghasilkan peta yang terlihat bagus. Contoh ini hanya membutuhkan tiga iterasi.

Michael Kristofik
sumber
Sangat bagus, dan +1 untuk memiliki contoh khususnya, tetapi saya akan sedikit khawatir bahwa ini sedikit terlalu biasa! Yang mengatakan, hasilnya benar-benar terlihat cantik terutama pada skala itu, dan itu juga merupakan cara yang sangat baik untuk menyemai metode lain.
Steven Stadnicki
1
Contoh saya terinspirasi oleh posting blog tentang pembuatan peta poligon . Penulis menambahkan beberapa noise ke tepi masing-masing daerah untuk membuat tampilan yang lebih bergerigi (gulir ke bawah untuk melihatnya). Anda harus menggunakan lebih banyak heks daripada yang saya lakukan untuk menjadikannya opsi yang layak, tetapi tentu saja bisa dilakukan.
Michael Kristofik
3

Satu cara sederhana yang bisa Anda coba.

  1. Pilih nheks secara acak . Masing-masing akan memulai grup.
  2. Untuk setiap kelompok, coba perluas hex awal dengan arah acak.
  3. Jika semua heks di sekitar heks yang dipilih ditempati, tandai sebagai ketuk, ubah heks.
  4. Ulangi sampai setiap grup memiliki panjang 20 hex atau tidak memiliki ruang lebih untuk melebarkan (semua hex disadap).

Saya tidak menguji tetapi ini harus menghasilkan Kepulauan dan agak menghindari kawat gigi tipis panjang. Juga, Kemungkinan besar akan ada perbatasan tetangga tetapi belum tentu masing-masing akan berhubungan dengan yang lain, kepadatan itu akan tergantung pada nilai n.
Beberapa kelompok juga mungkin terpojok oleh yang lain dan mencapai ukuran kurang dari 20, Anda dapat memastikan ruang tumbuh dengan menelurkan heks starter pada jarak minimum satu sama lain.
Tes dan atur sesuai kebutuhan.


Juga, tidak terkait dengan masalah ini tetapi sangat, sangat berguna untuk bekerja dengan hexes, kunjungi halaman ini: http://www.redblobgames.com/grids/hexagons/#basics
Ini mengumpulkan sejumlah besar informasi hex di satu tempat dengan visual yang bagus.

petervaz
sumber
Seharusnya mungkin menyertakan mekanik untuk grup A untuk memberikan node ke grup B, jika grup B berbatasan dengan grup A dan tidak punya tempat lain untuk pergi. Selama grup A memiliki ruang kosong untuk diperluas ke menggantikan node yang hilang. Maka tidak masalah dari mana mereka memulai. Karena ini bertindak seperti "mundur".
MichaelHouse
Saya berpikir mungkin memulai suatu negara pada suatu waktu, membentuk kelompok sudut pertama, kemudian yang tepi akan memberikan apa yang saya inginkan. Saya akan mencobanya ketika sampai di rumah.
MadCatPT
@ Byte56 Ya, saya benar-benar memikirkan sesuatu seperti ini sedikit selama makan siang saya. Jika kelompok terpojok tidak memiliki tempat untuk tumbuh, hanya perlu hex kelompok lain dan biarkan kelompok itu menemukan ruang kosong di iterasi berikutnya. Seharusnya memiliki beberapa perlindungan untuk menghindari 2 kelompok terpojok untuk menggertak tanpa batas satu sama lain sekalipun.
petervaz
Negara-negara nyata sering memiliki batas pada sungai atau gunung. Saat Anda memperluas ke arah acak, Anda dapat mencoba mengurangi kemungkinan ekspansi jika heks berikutnya di sisi lain sungai atau punggungan gunung.
amitp
@amitp Jika OP mengharapkan faktor-faktor itu diperhitungkan, dia mungkin akan menyebutkannya. Saya tidak berasumsi, hanya bekerja di dalam premis asli.
petervaz
2

Saya pasti berpikir beberapa jenis struktur grafik akan memungkinkan ini. Pada dasarnya buat tepi antara dua node Hex jika mereka bersebelahan untuk mensimulasikan seluruh peta. Namun, saya tidak yakin algoritma yang tepat untuk menghasilkan "negara" di dalam peta itu. Masalahnya adalah, tergantung pada bagaimana Anda ingin negara "terlihat" Anda akan membutuhkan algoritma yang berbeda.

Dari atas kepala saya, saya akan merekomendasikan memilih titik dan bergerak keluar dari sana, memilih ubin acak di dalam "negara berkembang" Anda yang memiliki ubin berdekatan yang bukan bagian dari negara.

Pola strategi dapat digunakan untuk mengganti algoritma tergantung pada jenis negara apa yang Anda inginkan. http://en.wikipedia.org/wiki/Strategy_pattern yaitu Anda ingin negara garis pantai ramping seperti Chili? Atau Anda menginginkan sesuatu yang lebih bulat dan berisi?

Properti grafik juga memungkinkan Anda mengubah apa yang Anda inginkan sebagai "negara" akhir: http://en.wikipedia.org/wiki/Eccentricity_(graph_theory)

Ingin negara besar? Tweak properti grafik dan paksa negara yang dihasilkan (yang hanya berupa grafik) untuk memiliki properti yang memberikan "tampilan" yang Anda inginkan.

Last but not least, Grafik juga akan sangat berguna untuk mendefinisikan perbatasan antar negara. Anda bisa membuat grafik yang memiliki koneksi antara dua node jika negara saling berbatasan. Ini mungkin berguna untuk beberapa jenis partisi di game Anda dan akan memungkinkan Anda untuk mengoptimalkan beberapa hal lebih lanjut dalam pengembangan.

Dean Knight
sumber
2

Satu catatan kecil: Anda mengatakan 'terlihat seperti peta kehidupan nyata dengan negara-negara yang bentuknya berbeda tetapi ukurannya sama), tetapi negara-negara' nyata 'sangat berbeda ukurannya bahkan di dalam wilayah tertentu - bahkan negara-negara' besar 'di Eropa dapat sangat bervariasi, misalnya dengan Perancis lebih dari dua kali lebih besar dari Italia. Dengan begitu, jelas ada wilayah permainan untuk mencoba dan mempertahankan ukuran kira-kira sama - hanya perlu diketahui bahwa sedikit variasi di sini mungkin bagus hal yang !

Pendekatan awal saya untuk masalah ini adalah untuk 'mengembangkan' (bukan 'menumbuhkan') wilayah Anda:

  • Mulailah dengan beberapa pembagian konkret dari peta menjadi potongan-potongan berukuran kira-kira sama dengan garis lurus (misalnya, jika Anda ingin 6 negara, maka Anda dapat membagi peta menjadi tiga irisan horizontal, dan kemudian membagi masing-masing irisan 'di diagonal' menjadi dua bagian). Ini jelas mudah dilakukan secara terprogram, terutama karena tidak harus sangat tepat (pada kenyataannya, mungkin seharusnya tidak terlalu tepat).
  • Lakukan operan awal pada divisi, membangun struktur data 'batas': seperangkat heks yang memiliki beberapa tetangga saat ini milik negara yang berbeda. Ini juga akan menjadi waktu yang tepat untuk menghitung berapa banyak heksa di setiap negara.

Sekarang, selama yang Anda inginkan, jalankan pseudocode berikut:

Pick a random hex A from the boundary list;
Pick a random neighbor B of this hex from a different country;
if (A's country has more hexes than B's country has) {
  change hex A to belong to B's country;
} else if (B's country has more hexes than A's country has) {
  change hex B to belong to A's country;
} else {
  flip a coin to decide which to change;
}
if ( the changed hex's old country has become disconnected ) {
  undo and reject this move;
} else {
  update the boundary list around the changed hex and its neighbors;
}

Ini akan menjaga keseimbangan antara ukuran dua negara tetangga, dan cek 'terputus' (yang dapat dilakukan dengan algoritma pengisian banjir sederhana) memastikan bahwa tidak ada negara yang pernah terbelah menjadi beberapa bagian. Memperbarui daftar batas adalah operasi waktu konstan - hex yang diubah jelas akan selalu berada di batas, dan Anda bisa memeriksa enam tetangganya untuk melihat apakah ada di antara mereka yang telah menjadi sel batas (karena tetangganya sekarang ada di batas negara yang berbeda) atau berhenti menjadi sel batas (karena tetangganya ada di negara yang sama sekarang), memodifikasi batas yang ditetapkan sesuai kebutuhan.

Untuk penyempurnaan dari pendekatan ini, Anda bahkan dapat membuat kondisi hex mana yang berubah sedikit acak - daripada selalu 'menyeimbangkan' kedua negara, Anda selalu dapat membuat swap dengan probabilitas tertentu, dan bahkan secara bertahap mengurangi probabilitas itu lebih dari waktu (mirip dengan proses pendinginan dalam algoritma Annealing Simulatif ) untuk mulai memaksa mereka untuk ukuran yang kira-kira sama.

Perhatikan bahwa ini tidak akan menjamin bahwa semua area berukuran persis sama (yang tidak mungkin kecuali N tetap membagi ukuran grid Anda dengan sempurna), dan itu bahkan tidak akan menjamin bahwa semua negara berada dalam satu hex satu sama lain di area; itu harus menjamin (berjalan selama cukup iterasi) bahwa setiap negara tidak lebih dari satu hex lebih besar atau lebih kecil dari masing-masing tetangganya, meskipun.

Steven Stadnicki
sumber