Saya pikir formalisme "ujung aljabar" Guibas dan Stolfi sedikit tidak perlu.
Yang perlu dilakukan hanyalah mengingat perbedaan antara grafik primal dan dua grafik. Setiap wajah dari grafik primal memiliki dual titik yang sesuai f * ; setiap tepi e dari grafik primal memiliki tepi ganda yang sesuai eff∗e ; dan masing-masing vertex v grafik primal memiliki sesuai ganda wajah v * . Tepi primal menghubungkan simpul primal dan memisahkan permukaan primal; tepi ganda menghubungkan simpul ganda dan memisahkan wajah ganda. Ganda dari apa pun adalah hal yang asli. Lihat Gambar 4 dalam makalah Guibas dan Stolfi:e∗vv∗
Guibas dan Stolfi mengusulkan berpikir tentang setiap sisi (baik primal atau rangkap) sebagai kumpulan dari empat tepi yang diarahkan, berorientasi ; untuk kesederhanaan, saya akan memanggil anak panah ini . Setiap anak panah poin dari satu titik akhir ekor ( → e ) ke titik akhir lainnya kepala ( → e ) , dan lokal memisahkan dua wajah kiri ( → e ) dan kanan ( → e ) . Pilihan titik akhir untuk memanggil ekor ( → e ) adalah milik anak panahe⃗ tail(e⃗ )head(e⃗ )left(e⃗ )right(e⃗ )tail(e⃗ )arah , dan pilihan wajah yang akan dipanggil ke adalah orientasinya . (Guibas dan Stolfi menggunakan "Org" dan "Dest" daripada "tail" dan "head", tetapi saya lebih suka label yang lebih pendek, karena Singkatan yang Tidak Perlu Adalah Jahat.)left(e⃗ )
Untuk anak panah , Guibas dan Stolfi mengasosiasikan tiga anak panah terkait:e⃗
- : Panah yang meninggalkan ekor ( → e ) berikutnya dalam urutan berlawanan arah setelah → e .tailNext(e⃗ )tail(e⃗ )e⃗
- flip(e⃗ )e⃗ left(e⃗ )right(e⃗ )
- rotate(e⃗ )e⃗
Tiga fungsi ini memenuhi semua jenis identitas yang indah, seperti yang berikut:
- right(tailNext(e⃗ ))=left(e⃗ )
- right(flip(e⃗ ))=left(e⃗ )
- right(rotate(e⃗ ))=head(e⃗ )∗
- flip(flip(e⃗ ))=e⃗
- rotate(rotate(rotate(rotate(e⃗ ))))=e⃗
- tailNext(rotate(tailNext(rotate(e⃗ ))))=e⃗
Untuk daftar lengkap, lihat halaman 83 dari makalah (tetapi waspadalah bahwa penulis menggunakan notasi postfix e Flipe.Flip
Selain itu, mengingat ketiga fungsi ini, seseorang dapat mendefinisikan beberapa fungsi berguna lainnya seperti
- reverse(e⃗ )=rotate(flip(rotate(e⃗ )))
- leftNext(e⃗ )=rotate(tailNext(rotate(rotate(rotate(e⃗ )))))e⃗ left(e⃗ )
Akhirnya, mengetahui fungsi-fungsi ini memberi tahu Anda segala sesuatu tentang topologi subdivisi, dan setiap subdivisi poligonal dari permukaan apa pun (yang dapat diorientasikan atau tidak) dapat dikodekan menggunakan tiga fungsi ini.
Struktur data quad-edge adalah representasi yang nyaman dari grafik permukaan yang menyediakan akses ke semua fungsi ini, bersama dengan beberapa operasi waktu konstan lainnya seperti memasukkan, menghapus, membuat kontrak, memperluas, dan membalikkan tepi; membelah atau menggabungkan simpul atau wajah; dan menambah atau menghapus handle atau cross-caps.
Selamat bersenang-senang!