2 คะแนน โดย GN⁺ 2024-06-13 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • อัลกอริทึม GJK คือวิธีตรวจสอบว่ารูปทรงสองรูปซ้อนทับกันหรือไม่
  • หากต้องการตรวจสอบว่ารูปทรง A และรูปทรง B ซ้อนทับกันหรือไม่ ก็เพียงตรวจดูว่ามีจุดใดจุดหนึ่งของทั้งสองรูปที่ทับกันหรือไม่

ผลต่างแบบ Minkowski

  • นำทุกจุดของรูปทรงสองรูปมาลบกันเพื่อสร้างเซตใหม่
  • หากเซตใหม่นี้มีจุดกำเนิดรวมอยู่ด้วย ก็หมายความว่ารูปทรงทั้งสองซ้อนทับกัน
  • สิ่งนี้เรียกว่า ผลต่างแบบ Minkowski

แนวคิดพื้นฐานของอัลกอริทึม

  • ตรวจสอบว่าผลต่างแบบ Minkowski ของ A และ B มีจุดกำเนิดอยู่ภายในหรือไม่
  • หากผลต่างนั้นมีจุดกำเนิดอยู่ภายใน แสดงว่ารูปทรงทั้งสองซ้อนทับกัน

ขั้นตอนของอัลกอริทึม

  1. กำหนดค่าเริ่มต้น: ตั้งค่าเวกเตอร์ทิศทาง d แบบใดก็ได้ และหาจุดแรก p
  2. หาจุด: คำนวณดอทโปรดักต์ของ d และ p ถ้าเป็นบวกให้ดำเนินการต่อ ถ้าเป็นลบให้จบ
  3. เพิ่มจุดใหม่: จาก p ให้หาจุดใหม่ในทิศทางของจุดกำเนิด
  4. ทำให้เป็นซิมเพล็กซ์: ใช้สองจุดแรกเป็นฐานแล้วเพิ่มจุดใหม่เพื่อสร้างซิมเพล็กซ์
  5. ตรวจสอบการครอบคลุมจุดกำเนิด: ตรวจสอบว่ารูปทรงที่ย่อให้เป็นซิมเพล็กซ์แล้วครอบคลุมจุดกำเนิดหรือไม่
  6. ทำซ้ำ: ทำซ้ำจนกว่าจะครอบคลุมจุดกำเนิด หรือจนกว่าจะพบหลักฐานว่าไม่ครอบคลุม

ความเห็นของ GN⁺

  • จุดที่น่าสนใจ: อัลกอริทึม GJK เป็นตัวอย่างที่ดีของการแก้ปัญหาซับซ้อนด้วยการแปลงทางคณิตศาสตร์ที่เรียบง่าย
  • เหตุผลที่มีประโยชน์: มีประโยชน์มากในงานกราฟิกส์แบบเรียลไทม์ เช่น การตรวจจับการชนกัน
  • มุมมองเชิงวิจารณ์: การนำอัลกอริทึมนี้ไปใช้งานจริงอาจซับซ้อน และต้องอาศัยความเข้าใจที่แม่นยำ
  • เทคโนโลยีที่เกี่ยวข้อง: อัลกอริทึมตรวจจับการชนกันแบบอื่นมี เช่น SAT(Separating Axis Theorem)
  • ข้อควรพิจารณา: เมื่อนำอัลกอริทึม GJK ไปใช้ ควรคำนึงถึงความซับซ้อนของรูปทรงและต้นทุนในการคำนวณ

1 ความคิดเห็น

 
GN⁺ 2024-06-13
ความคิดเห็นจาก 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 มาตลอด และดีใจที่ตอนนี้ได้รู้แล้วว่ามันคืออะไรจริง ๆ

  • ชื่นชมอัลกอริทึม: เป็นอัลกอริทึมที่ยอดเยี่ยมมาก