Generasi Pulau Barrier

Berita Desember tentang Badai Florence sering merujuk ke External Shoals - serangkaian pulau penghalang di lepas pantai North Carolina:


Pulau-pulau penghalang adalah hamparan pasir datar atau kuning yang terbentuk oleh ombak dan berselancar sejajar dengan pantai daratan. Mereka sering mengambil bentuk rantai panjang yang dapat merentang hingga puluhan mil. Pulau penghalang biasanya dipisahkan oleh saluran pasang surut kecil, dan dapat membentuk laguna antara pulau dan daratan.

Menurut Wikipedia , pulau-pulau penghalang dapat mencakup hingga 15% dari pantai, sehingga Anda dapat berharap untuk melihatnya di sebagian besar peta fantasi, tetapi kenyataannya mereka cukup langka. Dan karena sifat kebisingan, mereka hampir tidak pernah terjadi pada peta yang dihasilkan secara prosedural yang menggunakan kebisingan untuk membuat medan.

Untuk memahami mengapa demikian, mari kita lihat peta vanilla pulau:


Bahkan, itu adalah lingkaran yang terdistorsi oleh sejumlah kecil noise frekuensi rendah yang ditambahkan untuk membagi bentuk lingkaran. Ayo sekarang coba gunakan kebisingan untuk memecah pantai dan membentuk pulau-pulau pesisir. Inilah pulau yang sama dengan penambahan noise frekuensi rendah:


Memiliki bay dan jubah. Elemen reliefnya cukup besar karena saya menggunakan noise frekuensi rendah, yang berubah perlahan. Namun, kebisingannya tidak cukup kuat untuk membuat pulau. Mari kita dorong sedikit:


Sekarang kami telah membuat beberapa pulau, tetapi pada dasarnya itu adalah titik-titik melingkar, tidak perlu membentang di sepanjang pantai. Anda dapat menambahkan noise frekuensi tinggi:


Ini bisa memberi kita garis pantai yang sangat rusak dan pulau-pulau kecil di sepanjang pantai, tetapi tidak ada yang menyerupai pulau penghalang.

Satu-satunya alasan untuk ini adalah bahwa noise tidak cocok dalam x dan y, jadi meskipun noise tidak acak secara umum, bentuk yang dibuatnya acak:


Untuk beberapa hal ini bagus, tetapi tidak cocok untuk membuat bentuk tertentu, misalnya, pulau di sepanjang pantai.

Seperti dalam kasus lain, ketika saya perlu menghasilkan bentuk atau area tertentu, itu perlu untuk membuat topeng dari bentuk yang diperlukan, dan kemudian menggunakan suara di dalam topeng. (Anda juga dapat menggunakan suara untuk mengubah topeng dan memberikan bentuk yang lebih alami.) Pulau-pulau penghalang sebenarnya adalah daerah panjang dan tipis yang diimbangi dari pantai. Jadi mari kita buat topeng dengan bentuk ini.

Untuk memulainya, kita menetapkan bagian pantai di mana pulau penghalang akan berada. Ini dapat dilakukan dengan memilih titik acak di pantai, dan titik bawah kedua, yang ditandai pada gambar dengan garis merah di sudut kanan atas:


Untuk mulai membuat pulau penghalang, saya bisa mengambil garis lurus antara dua titik ini dan memproyeksikannya sedikit ke luar, ke dalam air. Ini akan memberi saya pulau yang terlihat sangat lurus dan tidak alami, tetapi Anda dapat mengubah bentuknya untuk menyembunyikannya. Masalah sebenarnya adalah bahwa pulau itu tidak akan mengikuti garis pantai. Mungkin akan terlihat normal untuk sebagian besar bentangan langsung pantai, tetapi akan terasa aneh di pesisir yang berliku. Lebih baik meniru garis pantai dan menjadikannya dasar bentuk pulau.

Untuk melakukan ini, saya perlu membuat salinan garis pantai, dan kemudian memproyeksikannya ke laut yang tegak lurus dengan garis pantai. Saya sudah memiliki prosedur untuk menghitung garis tegak lurus (normal) ke garis putus-putus sejak saya menyadari garis tulisan tangan , dan garis pantai saya selalu mengarah ke arah yang sama, jadi cukup sederhana:


Atau sepertinya sederhana. Mari kita lihat apa yang terjadi jika saya memproyeksikan garis pantai sedikit lebih jauh ke luar (untuk membuat sisi lain topeng pulau) pada bagian garis pantai yang kurang mulus:


Dua segmen garis yang diproyeksikan berpotongan satu sama lain dan menciptakan "delapan" yang menakutkan pada poligon. Inilah yang disebut masalah kurva paralel . Kita tidak bisa hanya menggeser pantai ke jarak tertentu, juga perlu untuk menyelesaikan masalah yang timbul dari sudut tajam internal dan eksternal.

Saya sedang mencari kode Javascript untuk menyelesaikan masalah ini, tetapi satu-satunya contoh yang ditemukan ( dari sini ) sangat menabrak bahkan pada sampel yang cukup sederhana. Jadi saya menulis sendiri. Secara umum, solusinya adalah dengan menggeser setiap titik di sepanjang normal, tetapi kemudian memeriksa apakah titik baru menciptakan garis yang memotong salah satu dari garis yang ada. Jika demikian, maka kita memotong lingkaran dan memasukkan garis baru yang terdiri dari titik persimpangan dan titik baru. Dalam kasus uji yang saya uji, sistem ini bekerja dengan baik untuk kebutuhan saya.

Jadi sekarang saya dapat membuat topeng sederhana (tanpa loop) untuk pulau-pulau:


Ini terlalu genap, jadi saya akan mengubah kontur:


Kontur mungkin menyentuh pantai di beberapa titik, tetapi ini normal, ini sering ditemukan di pulau penghalang.

Langkah selanjutnya adalah mengisi kontur dengan tanah, tetapi sebelum saya melakukan ini, saya ingin membuat pulau lebih panjang dan menambahkan logika menghindari berpotongan pulau jika membuat beberapa pulau penghalang di garis pantai yang sama.


Sekarang mari kita coba menambahkan beberapa tanah. Untuk melakukan ini, saya akan menaikkan ketinggian lokasi tanah apa pun (yang merupakan segitiga Delaunay) di atas permukaan laut:


Di sini perlu diperhatikan beberapa aspek. Pertama, di sudut kiri atas ada pulau penghalang yang cukup sukses. Namun, pulau itu sepertinya tidak mengisi TPA dengan baik. Banyak segitiga lahan "menyala" karena keberadaan pusatnya di dalam poligon. Ini menambah keacakan bentuk pulau. Kedua, orang dapat melihat bahwa dua pulau lainnya sangat dekat dengan pantai sehingga mereka hanya bergabung dengannya. Karena saya ingin membuat pulau di sini, saya tidak perlu ini terjadi terlalu sering, jadi saya akan menyiapkan generasi untuk mendapatkan kesenjangan air yang lebih besar antara garis pantai dan pulau. (Nanti saya akan menambahkan cek untuk mencegah hal ini terjadi.)


Salah satu hal yang menyenangkan tentang tanah segitiga tidak teratur adalah bahwa mereka secara alami membuat saluran pasang surut khas pulau penghalang. Hal buruk tentang mereka adalah bahwa mereka biasanya membuat pulau-pulau spot yang terlihat seperti mutiara yang terdistorsi pada seutas tali. Mereka tidak sangat mirip dengan pulau penghalang, dan jika Anda mengambil banyak segitiga individu, mereka terlihat sangat tidak wajar.

Jika saya menambah lebar pulau, kedua efek menghilang, dan saya mendapatkan lebih banyak pulau alami, tetapi tanpa saluran pasang surut:


Tetapi saya ingin belajar bagaimana menghasilkan pulau yang sangat sempit. Pendekatan lain adalah (secara signifikan) meningkatkan jumlah lokasi di dunia untuk meningkatkan resolusi:


Jadi kita bisa mendapatkan pulau yang sangat tipis dan terperinci, tetapi secara signifikan meningkatkan waktu dan memori yang diperlukan untuk membuat peta.

Dalam kedua metode ini, ada peluang bagus bahwa beberapa bagian pulau akan sangat tidak rata:


Ini terjadi karena jalan memotong dua sisi (dan kadang-kadang ketiga sisi) dari segitiga Delaunay yang mendasarinya. Ini adalah masalah yang melekat dalam menggunakan triangulasi Delaunay dalam pembuatan peta, tetapi karena alasan tertentu mereka jarang membahasnya! Ini terjadi di garis pantai dalam permainan saya tidak terlalu sering, karena untuk mengurangi jumlah kasus seperti itu, saya sengaja menambahkan fase smoothing, tetapi fase ini cenderung menghancurkan pulau-pulau sempit. Solusi potensial adalah membuat pulau yang sedikit lebih luas dan menggunakan anti-aliasing - jika diatur dengan benar, Anda bisa mendapatkan pulau yang lebih tipis tanpa banyak artefak segitiga:


Namun, dengan pendekatan ini, masih ada keterbatasan tentang seberapa sempit pulau itu. Selain itu, ini berarti bahwa kita tidak akan pernah mendapatkan garis pantai yang benar-benar fraktal.

Kadang-kadang algoritma perataan mengarah ke pemisahan pulau penghalang panjang menjadi beberapa pulau kecil (seperti di sudut kiri bawah gambar di atas), tetapi akan lebih mudah untuk memiliki opsi yang memungkinkan Anda melakukan ini secara paksa:


Satu-satunya yang tersisa adalah memberi nama pulau dan memetakannya. Satu-satunya aspek halus di sini adalah bahwa saya tidak ingin memberi nama untuk semua pulau di rantai pulau penghalang. Dalam rantai nyata pulau penghalang, masing-masing pulau sering memiliki nama, yang mengarah pada kekacauan di peta:


Oleh karena itu, ketika membuat pulau penghalang, saya memperhitungkan seluruh busur dan melampirkan satu nama padanya, meskipun sebagai hasilnya generasi memecah busur menjadi beberapa pulau:


Biasanya pulau penghalang disebut "Tepi" atau "Poros" (Batang), sehingga kata-kata ini ditemukan dalam nama varian.

Contoh ini menunjukkan masalah potensial penghalang pulau:


Di sini pulau penghalang dibuat di dalam teluk. Ini tidak masuk akal (selain itu, mengarah ke persimpangan nama). Untuk menghindari ini, saya dapat menggunakan logika pengenalan bay , dan melewati bagian garis pantai ini. Mungkin tidak ada perlindungan dari si bodoh dalam metode ini, tetapi itu berfungsi dengan baik untuk kartu ini:

Source: https://habr.com/ru/post/id439198/


All Articles