Pada peta ini, "daratan" adalah semua tanah yang dapat dihubungkan ke pusat peta dalam empat arah mata angin (utara, selatan, timur, barat - tidak secara diagonal).
Saya ingin mendeteksi daratan dan mengisi lubang di dalamnya. Saya memikirkan tiga hal:
Cari di setiap sel non-air (sel gelap) jika dapat dihubungkan ke pusat peta menggunakan algoritma pencarian jalur. Terlalu mahal! Tetapi ini bisa berhasil untuk pulau-pulau itu.
Daratan diisi dengan seember cat hijau. Setiap lubang dikelilingi oleh cat ... sekarang bagaimana? Jika saya memeriksa setiap titik air di dalam daratan untuk kedekatan saya akan menghapus beberapa semenanjung dan fitur geografis lainnya yang ditampilkan di garis pantai.
Beberapa jenis deteksi tepi untuk mencari tahu daratan. Simpan apa pun yang ada di dalamnya, isi jika air, lepaskan apa yang ada di luar. Kompleks?
Mungkin beberapa pengembang berpengalaman game dapat membantu saya dengan ini, mungkin memberi saya nama beberapa algoritma atau teknik yang dikenal?
Jawaban:
Menghapus Pulau
Saya telah melakukan hal semacam ini sebelumnya di salah satu permainan saya. Untuk menghilangkan pulau-pulau terluar, prosesnya pada dasarnya adalah:
Menghapus Danau
Sedangkan untuk menyingkirkan lubang (atau danau) di dalam pulau, Anda melakukan proses serupa tetapi mulai dari sudut peta dan menyebar melalui ubin "Air" sebagai gantinya. Ini akan memungkinkan Anda untuk membedakan "Laut" dari ubin air lainnya, dan kemudian Anda dapat menyingkirkannya seperti Anda menyingkirkan pulau-pulau sebelumnya.
Contoh
Biarkan saya menggali implementasi pengisian banjir yang saya miliki di suatu tempat (penafian, saya tidak peduli dengan efisiensi, jadi saya yakin ada banyak cara yang lebih efisien untuk mengimplementasikannya):
Saya menggunakan ini sebagai langkah pertama untuk menyingkirkan danau di game saya. Setelah memanggil itu, yang harus saya lakukan adalah sesuatu seperti:
Edit
Menambahkan beberapa informasi tambahan berdasarkan komentar. Jika ruang pencarian Anda terlalu besar, Anda mungkin mengalami stack overflow saat menggunakan versi algoritme rekursif. Berikut ini adalah tautan pada stackoverflow (maksud kata :-)) ke versi algoritma yang tidak rekursif, menggunakan
Stack<T>
bukan (juga dalam C # untuk mencocokkan jawaban saya, tetapi harus mudah untuk beradaptasi dengan bahasa lain, dan ada implementasi lain pada itu tautan juga).sumber
Ubah algoritma pengisian banjir empat arah http://en.wikipedia.org/wiki/Flood_fill
sumber
Ini adalah operasi standar dalam pemrosesan gambar. Anda menggunakan operasi dua fase.
Mulailah dengan membuat salinan peta. Dari peta ini, ubah menjadi piksel lautan semua piksel daratan yang berbatasan dengan laut. Jika Anda melakukan ini sekali, itu akan menghilangkan pulau 2x2, dan menyusut pulau-pulau yang lebih besar. Jika Anda melakukannya dua kali, itu akan menghilangkan pulau 4x4, dan sebagainya.
Pada fase dua, Anda melakukan hampir kebalikannya: berubah menjadi piksel daratan semua piksel laut yang berbatasan dengan tanah, tetapi hanya jika piksel tersebut merupakan piksel daratan di peta asli (Itulah sebabnya Anda membuat salinan di fase 1). Ini menumbuhkan kembali pulau-pulau ke bentuk aslinya, kecuali jika mereka sepenuhnya dihilangkan dalam fase 1.
sumber
Saya memiliki masalah serupa tetapi tidak dalam pengembangan game. Saya harus menemukan piksel dalam gambar yang berdekatan satu sama lain dan memiliki nilai yang sama (wilayah yang terhubung). Saya mencoba menggunakan TPA rekursif tetapi terus menyebabkan stack overflows (Saya seorang programmer pemula: P). Kemudian saya mencoba metode ini http://en.wikipedia.org/wiki/Connected-component_labeling itu sebenarnya jauh lebih efisien, untuk masalah saya.
sumber