Saya membahas hal ini dalam komentar saya yang lain, tetapi saya pikir di sini Anda sedang memikirkan klasifikasi eksternal / internal. Dengan menghapus voxel, Anda mengubah voxel di sekitarnya menjadi 'edge' voxel (jika belum). Ini harus direbus menjadi 3 kasus aktual (simetri membuat Anda sisa dari mereka) - dalam contoh di bawah angka adalah ID grup, - adalah voxel sedang dihapus
11 2
1- 1- 1-2
Kasing pertama sepele - ini adalah sudut, tetapi voxel di atas dan ke kiri tetap sepenuhnya terhubung melalui voxel lainnya.
Kasus kedua: itu sudut dan voxel yang dihapus telah memutus voxel atas dan kiri yang sebelumnya terhubung
Kasus ketiga: ini adalah garis, dan voxel yang dihapus telah memutus voxel kiri dan kanan yang sebelumnya terhubung.
Jika Anda mengidentifikasi bahwa kasus ke-2 atau ke-3 telah terjadi, Anda perlu melakukan beberapa pencarian jalur untuk melihat apakah 1 dan 2 masih terhubung melalui voxel lainnya yang berdekatan.
Anda bisa mendapatkan efisiensi di sini. Jika voxel sepenuhnya internal ke grup (yaitu semua 8 tetangganya adalah bagian dari grup yang sama), maka voxel dapat didiskon. Mengapa? Itu masalah topologi. Bayangkan case 2D - hanya ada dua kemungkinan. Entah ada tepi tunggal yang, terlepas dari bagaimana ia berputar dan berputar, masih membentuk cincin voxel. Atau, ada dua cincin, satu berisi satu voxel, dan satu lagi berisi yang lain. Misalnya:
xxx xxx
x x-x x
xxx xxx
atau
xxxxxxx
x x
xxx xxx
x-x
xxx xxx
Itu juga harus diperluas ke 3D, kecuali sebagai ganti cincin batas, Anda akan memiliki permukaan batas. Jadi, ketika Anda mencoba menentukan apakah dua voxel yang baru-baru ini diputus masih terhubung, Anda dapat mengecualikan semua voxel internal dari traversal Anda, karena menurut definisi jika voxel terhubung ke salah satu voxel batas grup, itu juga terhubung ke semua voxels internal dalam grup itu.
Ini semacam efek sebaliknya dari hub voxels yang saya bicarakan dalam jawaban saya untuk pertanyaan lain - Anda tidak harus menemukan jalan Anda dari setiap voxel ke setiap voxel lainnya, Anda hanya perlu menemukan jalan ke voxel yang menarik .
Jika Anda menggunakan A *, Anda dapat menggunakannya di sini.
Dimulai dengan daftar voxel yang terhubung ke voxel yang dihapus. Mulailah dengan yang pertama dalam daftar, gunakan A * untuk menemukan jalur ke yang kedua dalam daftar. Jika ada jalan, temukan jalur dari yang kedua ke yang ketiga, ketiga ke keempat dan seterusnya.
Sebagian besar pencarian itu akan sangat cepat, karena voxel akan berada tepat di sebelah satu sama lain. Jika ada jalan yang gagal, itu berarti diskontinuitas telah dibuat.
Ini seharusnya cukup mudah diimplementasikan jika Anda sudah menerapkan fungsionalitas A *.
sumber