Saya punya peta yang dibuat secara prosedural menggunakan sel Voronoi, dengan permukaan laut yang ditentukan dan peta ketinggian yang bisa dipercaya.
Sejauh ini, saya telah berhasil memberi label fitur geografis tertentu: tanah, laut, danau, sungai, muara, pertemuan, gunung, dan bioma. Bioma termasuk tundra, hutan boreal, padang rumput, dan hutan sedang. Ada juga beberapa bioma lain di sana tetapi untuk tujuan saya mereka tidak penting saat ini.
Saya ingin memberi label bay, dan selat berikutnya, tetapi saya bingung bagaimana cara melakukannya dengan benar. Sebuah teluk adalah badan air pantai yang tersembunyi yang langsung terhubung ke laut.
Selat adalah jalur air sempit yang terbentuk secara alami yang menghubungkan dua bagian lautan. Pada dasarnya, di mana dua bidang tanah hampir menyentuh dan ada lautan di kedua sisi. Disebut juga "saluran".
Untuk menentukan fitur, saya dapat mengulangi semua fitur berdasarkan tipe seperti ini:
for each (var feature:Object in geography.getFeaturesByType(Geography.LAND))
// loop through lands
for each (var cell:Cell in feature.cells)
// loop through cells
for each (var neighbor:Cell in cell.neighbors)
// loop through a cell's neighbors
trace(neighbor.hasFeatureType(Geography.LAND));
sumber
Jawaban:
Cara Dragons Abound mengidentifikasi teluk adalah berjalan di sepanjang garis pantai dan menemukan dua titik di garis pantai di mana jarak garis lurus di antara titik-titik itu kurang dari jarak di sepanjang garis pantai di antara titik-titik tersebut. Ini adalah sinuositas garis pantai antara dua tempat. Dengan memilih batas sinuositas dan batas jarak garis lurus antara titik-titik Anda dapat mengidentifikasi teluk dalam yang sempit, teluk dangkal lebar, dll.
Dalam gambar ini, titik-titik merah dan ungu menunjukkan dua titik kandidat dan garis hijau adalah garis pantai di antara titik-titik tersebut. Sinuositas adalah rasio dari dua panjang tersebut:
Atau, Anda dapat memilih dua titik di pantai dan membuat poligon dengan menghubungkan dua titik dan garis pantai antara dua titik (yaitu, hubungkan garis hijau di atas dari titik merah ke titik ungu). Ukur luas poligon ini. Sebuah teluk akan memiliki area yang lebih besar daripada non-teluk.
Dalam pengalaman saya, kombinasi dari kedua langkah ini adalah yang terbaik untuk mengidentifikasi dengan tepat apa yang orang lihat sebagai teluk.
Perhatikan bahwa ini juga akan mendeteksi poin. Untuk menemukan hanya teluk, Anda perlu memeriksa bahwa "bagian dalam" teluk mengandung air dan bukan tanah. Cara cepat dan mudah untuk melakukan ini adalah dengan memeriksa titik tengah garis antara dua titik untuk melihat apakah itu air. (Ini bisa dibodohi tetapi umumnya cukup.)
Masalah terkait adalah untuk mengidentifikasi "mulut" teluk - yaitu, pilihan terbaik untuk dua titik yang menandai pembukaan ke teluk. Biasanya Anda akan memiliki banyak kandidat untuk "mulut". Pada contoh peta di atas, Anda bisa menempatkan mulut teluk itu lebih jauh atau lebih jauh. Secara umum itu mungkin tidak terlalu penting, tetapi satu heuristik yang bekerja cukup baik adalah untuk meminimalkan jarak garis lurus di mulut.
Saya belum melakukan selat, tetapi intuisi saya adalah untuk memeriksa titik di sepanjang garis pantai untuk menemukan titik terdekat di garis pantai lainnya; jika itu di bawah batas yang ditentukan itu adalah selat.
sumber
Inilah ide kasar menggunakan transformasi pemrosesan gambar untuk mengisolasi fitur-fitur yang menarik:
Oleskan isian banjir dari sel lautan untuk membuat topeng dari semua sel lautan. Bergantung pada bagaimana sungai Anda diatur, Anda mungkin membutuhkan kriteria ketinggian atau izin tambahan untuk menjaga topeng laut agar tidak mengalir ke daratan. ;)
Oleskan perataan lokal ke tepi topeng ini, menjaga agar keterhubungan / topologi tetap sama, tetapi menghaluskan fitur garis pantai kecil yang berisik yang dapat mengganggu. Ini memungkinkan kita fokus pada teluk besar di atas lubang kecil. Anda dapat menggunakan lebar filter / jumlah iterasi Anda untuk mengontrol skala fitur yang Anda pertahankan dengan halus.
Di sini saya menerapkan filter median beberapa kali. Automata seluler adalah cara populer lainnya untuk mengikis bentuk halus dari input yang bising.
Ubah topeng menjadi bidang jarak, di mana setiap sel menyimpan jaraknya dari garis pantai yang dihaluskan.
Sekarang kita melihat beberapa fitur yang menjanjikan. Dalam bidang jarak yang ditandatangani, kedua teluk dan selat muncul sebagai punggungan yang tajam, dengan jarak jatuh ke samping. Kita dapat menggunakan filter deteksi tepi untuk menghilangkan ridges ini:
Anda kemudian dapat membedakan antara bay dan selat dengan mengikuti punggungan untuk menentukan konektivitasnya. Sebuah teluk adalah punggungan yang membentang ke arah pantai, semakin dangkal dan dangkal (dalam jarak dari daratan) hingga berakhir di suatu titik. Selat adalah punggungan yang menghubungkan wilayah jarak tinggi ke wilayah jarak jauh lainnya, melewati daerah jarak lebih rendah di sepanjang jalan.
Atau, cara lain adalah dengan menetapkan setiap pulau ID (pencarian komponen yang terhubung), maka saat Anda membuat bidang jarak Anda, sebarkan "ID pulau terdekat" di sepanjang batas jarak. Sebuah teluk atau inlet kemudian merupakan punggungan dalam air yang berdekatan dengan daratan yang sama di kedua sisi, sedangkan saluran adalah punggungan yang memisahkan air yang berdekatan dengan dua daratan yang berbeda.
Anda dapat menetapkan batasan jarak & maksimum minimum & maksimum untuk mengendalikan fitur mana yang akan dilabeli, jika Anda perlu mengecualikan selat yang terlalu sempit / lebar misalnya.
sumber
Pada dasarnya, Anda perlu berpikir tentang apa yang Anda maksudkan, tepatnya, dengan teluk atau selat, dan mengapa Anda ingin membedakannya (apakah itu untuk perhitungan AI, atau untuk menandai landmark, atau yang lainnya?). Bermain-mainlah dengan beberapa definisi untuk menemukan definisi yang paling cocok untuk Anda. Kemudian, rumuskan kondisi untuk memeriksa sel Voronoi Anda. Beberapa saran:
Teluk
Selat
sumber