- อัลกอริทึม GJK คือวิธีตรวจสอบว่ารูปทรงสองรูปซ้อนทับกันหรือไม่
- หากต้องการตรวจสอบว่ารูปทรง A และรูปทรง B ซ้อนทับกันหรือไม่ ก็เพียงตรวจดูว่ามีจุดใดจุดหนึ่งของทั้งสองรูปที่ทับกันหรือไม่
ผลต่างแบบ Minkowski
- นำทุกจุดของรูปทรงสองรูปมาลบกันเพื่อสร้างเซตใหม่
- หากเซตใหม่นี้มีจุดกำเนิดรวมอยู่ด้วย ก็หมายความว่ารูปทรงทั้งสองซ้อนทับกัน
- สิ่งนี้เรียกว่า ผลต่างแบบ Minkowski
แนวคิดพื้นฐานของอัลกอริทึม
- ตรวจสอบว่าผลต่างแบบ Minkowski ของ A และ B มีจุดกำเนิดอยู่ภายในหรือไม่
- หากผลต่างนั้นมีจุดกำเนิดอยู่ภายใน แสดงว่ารูปทรงทั้งสองซ้อนทับกัน
ขั้นตอนของอัลกอริทึม
- กำหนดค่าเริ่มต้น: ตั้งค่าเวกเตอร์ทิศทาง
d แบบใดก็ได้ และหาจุดแรก p
- หาจุด: คำนวณดอทโปรดักต์ของ
d และ p ถ้าเป็นบวกให้ดำเนินการต่อ ถ้าเป็นลบให้จบ
- เพิ่มจุดใหม่: จาก
p ให้หาจุดใหม่ในทิศทางของจุดกำเนิด
- ทำให้เป็นซิมเพล็กซ์: ใช้สองจุดแรกเป็นฐานแล้วเพิ่มจุดใหม่เพื่อสร้างซิมเพล็กซ์
- ตรวจสอบการครอบคลุมจุดกำเนิด: ตรวจสอบว่ารูปทรงที่ย่อให้เป็นซิมเพล็กซ์แล้วครอบคลุมจุดกำเนิดหรือไม่
- ทำซ้ำ: ทำซ้ำจนกว่าจะครอบคลุมจุดกำเนิด หรือจนกว่าจะพบหลักฐานว่าไม่ครอบคลุม
ความเห็นของ GN⁺
- จุดที่น่าสนใจ: อัลกอริทึม GJK เป็นตัวอย่างที่ดีของการแก้ปัญหาซับซ้อนด้วยการแปลงทางคณิตศาสตร์ที่เรียบง่าย
- เหตุผลที่มีประโยชน์: มีประโยชน์มากในงานกราฟิกส์แบบเรียลไทม์ เช่น การตรวจจับการชนกัน
- มุมมองเชิงวิจารณ์: การนำอัลกอริทึมนี้ไปใช้งานจริงอาจซับซ้อน และต้องอาศัยความเข้าใจที่แม่นยำ
- เทคโนโลยีที่เกี่ยวข้อง: อัลกอริทึมตรวจจับการชนกันแบบอื่นมี เช่น SAT(Separating Axis Theorem)
- ข้อควรพิจารณา: เมื่อนำอัลกอริทึม GJK ไปใช้ ควรคำนึงถึงความซับซ้อนของรูปทรงและต้นทุนในการคำนวณ
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
อัลกอริทึม GJK: เคยใช้เวลาลำบากอยู่เป็นปีเพื่อทำความเข้าใจอัลกอริทึม GJK ในช่วงทศวรรษ 1990 มันมีประโยชน์สำหรับการตรวจจับการชนและการหาจุดที่ใกล้ที่สุด แนวคิดพื้นฐานเข้าใจได้ไม่ยาก เริ่มจากวัตถุนูนสองชิ้น เลือกจุดแบบสุ่ม แล้วพยายามปรับปรุงระยะห่างระหว่างจุดเหล่านั้น เลือกจุดที่ใกล้ที่สุดแล้วทำซ้ำ เมื่อจุดที่ใกล้ที่สุดไม่ใช่จุดยอดอีกต่อไป ก็จำเป็นต้องใช้แนวคิดของ "simplex" ซึ่งก็คือการวิเคราะห์หลายกรณี ใน physics engine จะเกิดปัญหาเมื่อวัตถุลงตัวอยู่ในสภาวะสัมผัสแบบหน้า-ต่อ-หน้า ในทางทฤษฎีมันเป็นวิธีแก้ที่งดงาม แต่ในทางปฏิบัติเป็นปัญหาการวิเคราะห์เชิงตัวเลขที่ยาก ถึงอย่างนั้นก็น่าจะยังเป็นแนวทางที่เร็วที่สุด กรณีทั่วไปคือ O(log N) และถ้าอยู่ใกล้ตำแหน่งก่อนหน้าคือ O(1) ศาสตราจารย์ Stephen Cameron แห่ง Oxford ผู้ล่วงลับ ได้ทำวิจัยมากมายเพื่อทำให้การติดตั้งใช้งาน GJK ถูกต้อง เคยใช้ GJK ในระบบ ragdoll 3D เชิงพาณิชย์ "Falling Bodies" ช่วงปลายทศวรรษ 1990
การเขียนคำอธิบาย GJK: หาคำอธิบายเชิงสัญชาตญาณของอัลกอริทึมตรวจจับการชน GJK ไม่เจอ จึงเขียนขึ้นเอง และขอให้ช่วยแนะนำหากมีวิธีทำให้ชัดเจนและมีประสิทธิภาพกว่านี้ คำอธิบายนี้เกี่ยวข้องกับคณิตศาสตร์ระดับนักเรียนมัธยมปลาย จึงควรอ่านด้วยความระมัดระวังตามสมควร
วิดีโออัลกอริทึม GJK: แชร์ลิงก์พรีเซนเทชันวิดีโอเกี่ยวกับอัลกอริทึมเดียวกันนี้ ลิงก์วิดีโอ
ชื่นชมบทความ: เป็นบทความที่ยอดเยี่ยม ชัดเจนมากและน่าสนใจ
เปรียบเทียบกับ convex optimization: อีกวิธีหนึ่งในการตรวจสอบจุดตัดระหว่างเซตนูนสองเซต คือแก้ปัญหา convex optimization ที่ทำให้ norm ของผลต่างระหว่างสองจุดมีค่าน้อยที่สุด ถ้าค่าที่เหมาะที่สุดเป็น 0 แสดงว่าเซตมีจุดตัด อยากเห็นการเปรียบเทียบระหว่างอัลกอริทึม GJK กับวิธี convex optimization ยังไม่แน่ใจว่าวิธีไหนดีกว่ากัน
ชื่นชมบทความและข้อเข้าใจผิด: เป็นบทความที่ยอดเยี่ยม เพียงแต่ภาพแรกแสดงจุดตัดของรูปทรงไม่เป็นนูน ขณะที่ภายหลังจึงค่อยอธิบายว่าอัลกอริทึมนี้ใช้ได้เฉพาะกับรูปทรงนูนเท่านั้น
เพิ่งรู้จักอัลกอริทึม GJK: เพิ่งเคยได้ยินเกี่ยวกับอัลกอริทึม GJK เป็นครั้งแรก
บล็อกโพสต์ที่เกี่ยวข้อง: เคยเขียนบล็อกโพสต์ที่เกี่ยวข้องกับเรขาคณิตแบบ Minkowski ลิงก์บล็อก
เว็บไซต์ส่วนตัว: กล่าวว่าจู่ ๆ เว็บไซต์ส่วนตัวก็ได้รับความสนใจโดยไม่คาดคิด และมีเนื้อหาแนวขำ ๆ อยู่เต็มไปหมด ถ้าอยากติดต่อให้บอกผ่านการตอบกลับ
การใช้ฟังก์ชัน Minkowski: ใช้ฟังก์ชัน Minkowski ใน openSCAD มาตลอด และดีใจที่ตอนนี้ได้รู้แล้วว่ามันคืออะไรจริง ๆ
ชื่นชมอัลกอริทึม: เป็นอัลกอริทึมที่ยอดเยี่ยมมาก