Algoritme GJK: Cara Menyelesaikan Hal Sederhana dengan Aneh dan Indah
(computerwebsite.net)- Algoritme GJK adalah metode untuk memeriksa apakah dua bentuk saling bertumpang tindih
- Untuk memeriksa apakah bentuk A dan bentuk B bertumpang tindih, cukup periksa apakah ada titik dari kedua bentuk yang saling tumpang tindih
Selisih Minkowski
- Membuat himpunan baru dengan mengurangkan semua titik dari dua bentuk.
- Jika himpunan baru ini mencakup titik asal, itu berarti kedua bentuk bertumpang tindih.
- Ini disebut selisih Minkowski.
Ide dasar algoritme
- Memeriksa apakah selisih Minkowski dari A dan B mencakup titik asal.
- Jika selisih tersebut mencakup titik asal, kedua bentuk bertumpang tindih.
Langkah-langkah algoritme
- Inisialisasi: Tetapkan vektor arah sembarang
d, lalu cari titik pertamap. - Mencari titik: Hitung hasil kali titik dari
ddanp; jika positif lanjutkan, jika negatif hentikan. - Menambahkan titik baru: Dari
p, cari titik baru ke arah titik asal. - Penyederhanaan: Tambahkan titik baru berdasarkan dua titik pertama untuk melakukan simplifikasi.
- Memeriksa apakah mencakup titik asal: Periksa apakah bentuk yang telah disederhanakan mencakup titik asal.
- Ulangi: Ulangi sampai bentuk mencakup titik asal atau sampai ditemukan bukti bahwa titik asal tidak tercakup.
Opini GN⁺
- Hal yang menarik: Algoritme GJK adalah contoh yang baik tentang bagaimana masalah kompleks dapat diselesaikan dengan transformasi matematis yang sederhana.
- Mengapa ini membantu: Sangat berguna dalam grafika real-time seperti deteksi tabrakan.
- Sudut pandang kritis: Implementasi algoritme bisa rumit dan membutuhkan pemahaman yang tepat.
- Teknologi terkait: Algoritme deteksi tabrakan lainnya mencakup SAT (Separating Axis Theorem) dan sebagainya.
- Hal yang perlu dipertimbangkan: Saat menggunakan algoritme GJK, kompleksitas bentuk dan biaya komputasi perlu dipertimbangkan.
1 komentar
Komentar Hacker News
Pada 1990-an, saya hampir setahun kerepotan karena GJK
Ini berguna untuk deteksi tumbukan 3D, dan juga bisa dipakai sebagai algoritme titik terdekat. Ide dasarnya mudah dipahami. Saat ada dua benda padat cembung, ambil masing-masing satu titik sembarang dari tiap benda, hitung jarak di antara dua titik itu, lalu coba bergerak dari titik saat ini di sepanjang tiap rusuk untuk memperbaiki jaraknya dan ulangi proses memilih titik terdekat baru
Namun jika titik terdekat bukan lagi sebuah simpul, pendekatan ini rusak, dan di sinilah konsep simplex dibutuhkan. Kombinasi titik terdekat terbagi menjadi simpul-simpul, simpul-rusuk, simpul-bidang, rusuk-rusuk, rusuk-bidang (tidak ada solusi unik), dan bidang-bidang (tidak ada solusi unik), dan penanganan simplex pada dasarnya lebih dekat ke analisis kasus-kasus ini
Dalam praktiknya, banyak masalah muncul. Dalam engine fisika, objek sering stabil dalam keadaan kontak bidang-bidang, dan model tumbukan satu titik dapat menimbulkan osilasi atau gerakan yang salah. Selain itu, ketika posisi berkonvergensi ke kontak bidang-bidang, GJK harus menangani selisih kecil di antara nilai-nilai besar, sehingga bisa sepenuhnya kehilangan digit signifikan floating point. Kondisi terminasi juga dapat menyebabkan loop tak berhingga
Secara teori elegan, tetapi dalam praktiknya ini adalah masalah analisis numerik yang sulit. Meski begitu, ini mungkin pendekatan tercepat untuk masalah ini. Pada kasus umum kompleksitasnya O(log N), dan jika memakai solusi terakhir sebagai titik awal pada situasi yang paling dekat dengan posisi sebelumnya, bisa mendekati O(1)
Mendiang Prof. Steven Cameron dari Oxford melakukan banyak pekerjaan agar GJK berjalan dengan benar, dan pada akhir 1990-an GJK digunakan dalam "Falling Bodies", sistem ragdoll 3D komersial pertama
Mendapatkan itu lebih buruk secara numerik. Mulai dari simplex yang dibuat GJK, lalu memperluasnya ke luar, dan dalam prosesnya harus melakukan triangulasi. Mengimplementasikannya dengan performa baik benar-benar mendekati mimpi buruk
Saya penasaran apakah patennya sudah kedaluwarsa, dan apakah ada niat untuk merilis kodenya. Secara historis itu bermakna, dan sepertinya akan menjadi bahan menarik seperti membaca source Doom
Saya tidak menemukan tulisan yang menjelaskan algoritme deteksi tumbukan GJK secara intuitif, jadi saya meluangkan waktu sore untuk merangkumnya sendiri
Kalau ada cara untuk membuatnya lebih jelas dan efisien, saya akan senang diberi tahu. Tentu saja, mohon maklumi bahwa ini tulisan seorang siswa kelas 2 SMA yang menjelaskan materi matematika
Sudah bagus, tetapi agar lebih sempurna mungkin bisa ditambahkan beberapa hal. Penjelasan singkat tentang kompleksitas waktu pada kasus terburuk, bagian terpisah yang membahas kondisi terminasi, dan pseudocode di sela-sela penjelasan akan bagus
Cara menjelaskan dari sudut pandang matematis seperti sekarang cocok dan layak dipertahankan. Namun setelah tiap langkah, akan lebih baik jika menambahkan pseudocode singkat yang memuat sejauh mana algoritme sudah berjalan, sambil mendefinisikan fungsi bantu seperti
S(•)Tulisan tentang model tersembunyi OpenAI juga bagus. Waktu yang dihabiskan untuk mencari tahu apa lagi yang dibuat seseorang yang menghasilkan karya mengesankan hampir selalu berharga
Judulnya seharusnya "as simply as possible". Saya tidak tahu algoritme GJK sebelumnya, tetapi kalau saat ini sedang mengajar Calculus III, saya mungkin akan mencari cara memasukkan materi ini ke kelas. Penjelasannya memang sebagus itu
Pada contoh persegi panjang bersudut membulat yang halus di akhir tulisan, saya tidak tahu apa yang mencegahnya hanya makin mendekati jawaban tanpa benar-benar mencapainya. Tentu saja, dalam komputasi nyata saya tahu tidak ada alasan untuk terus berjalan setelah batas presisi praktis
Awalnya saya mengartikannya sebagai A dan B diberi suatu transformasi sehingga menghasilkan bentuk A-B. Setelah membaca ulang beberapa kali, tampaknya A-B bukan dua himpunan di kiri, melainkan menunjukkan irisan A dan B yang lain, dan yang penting adalah irisan itu tumpang tindih dengan titik asal atau 0,0. Saya penasaran apakah itu benar
Presentasi video yang membahas algoritme yang sama: https://www.youtube.com/watch?v=ajv46BSqcK4
Di bagian akhir ada demo interaktif yang menunjukkan selisih Minkowski
Tulisannya sangat jelas dan menarik
Cara lain untuk memeriksa apakah dua himpunan cembung berpotongan adalah dengan menyelesaikan masalah optimisasi cembung yang meminimalkan norma selisih antara titik yang termasuk dalam himpunan cembung pertama dan titik yang termasuk dalam himpunan cembung kedua. Jika nilai optimalnya 0, kedua himpunan berpotongan
Akan menarik membandingkan algoritme GJK dengan optimisasi cembung. Saya tidak tahu mana yang lebih menguntungkan
Gambar pertama menunjukkan perpotongan bentuk non-cembung, sementara fakta bahwa algoritme ini hanya bekerja pada bentuk cembung baru muncul jauh setelahnya, jadi ini bisa sedikit menyesatkan
Saya sudah cukup lama memakai fungsi Minkowski di openSCAD, dan senang akhirnya mengetahui apa sebenarnya itu
Karena ternyata mendapat perhatian lebih besar dari yang diperkirakan, rasanya perlu saya katakan bahwa situs pribadi itu pada dasarnya adalah kumpulan inside joke yang rumit
Kalau ingin menghubungi saya atau ada sesuatu yang perlu dilakukan, beri tahu lewat balasan
Hampir 10 tahun lalu saya mengimplementasikan GJK berdasarkan penjelasan Casey yang luar biasa: https://www.youtube.com/watch?v=Qupqu1xe7Io
Saya pernah menulis artikel terkait geometri Minkowski: https://nickp.svbtle.com/asteroid-intersections