Menentukan apakah penghapusan voxel akan memecah grup

8

Saya memiliki situasi berikut: Saya memiliki kotak 3d voxels (on / off, ukuran maks mungkin 128x128x128). Saya tahu sebelumnya bahwa di dalam grid, semua voxel yang dihidupkan saling berhubungan, membentuk satu kelompok.

Sekarang saya perlu menentukan: ketika saya menghapus voxel (matikan), apakah itu akan memecah grup?

Ide awal saya adalah untuk melihat tetangga voxel yang dihapus dan menentukan apakah mereka masih saling berhubungan melalui voxel lain (lihat pertanyaan saya yang lain: Algoritma untuk melihat apakah dua voxel saling berhubungan ). Tetapi mungkin ada yang lebih baik / cara lain untuk melakukan ini.

Jadi apa cara yang baik untuk menentukan apakah pengangkatan voxel akan memecah kelompok yang menjadi bagiannya?

Bram Vaessen
sumber

Jawaban:

4

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 .

MrCranky
sumber
Terima kasih, hanya menggunakan voxel di permukaan volume sepertinya optimasi yang sangat baik.
Bram Vaessen
3

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 *.

MichaelHouse
sumber