การทดสอบจุดตัดขอบกล่องวัตถุ 2 มิติชิดขอบ


9

ฉันมีสองกล่องขอบเขตวัตถุจัดชิด (เช่นไม่จัดแนวแกนพวกเขาหมุนด้วยวัตถุ) ฉันต้องการทราบว่ากล่องที่วางวัตถุสองกล่องซ้อนทับกันหรือไม่ ( แก้ไข: หมายเหตุ - ฉันกำลังใช้การทดสอบกล่องที่มีขอบเป็นแนวแกนเพื่อกำจัดวัตถุที่อยู่ไกลออกไปอย่างรวดเร็วดังนั้นมันจึงไม่สำคัญว่ารูทีนรูปสี่เหลี่ยมจะช้ากว่าเล็กน้อย )

กล่องของฉันถูกจัดเก็บเป็นสี่ x, y คะแนน ฉันค้นหาคำตอบแล้ว แต่ฉันไม่เข้าใจชื่อตัวแปรและอัลกอริทึมในตัวอย่างเพื่อนำไปใช้กับกรณีเฉพาะของฉัน

มีใครช่วยแสดงให้ฉันเห็นว่าจะทำอย่างไรในวิธีที่ชัดเจนและเรียบง่าย? ขอบคุณ (ภาษานั้นไม่สำคัญรหัสหลอกแบบ C คือ OK)

คำตอบ:


5

หากคุณรู้จักที่จะมองมันเป็นเรื่องง่าย คุณกำลังมองหา oobb ไปที่นี่: http://www.realtimerendering.com/intersections.html
มีคุณพบลิงค์ไปยังเว็บไซต์นี้ http://www.geometrictools.com/LibMathematics/Intersection/Intersection.html
และพบรหัสที่ถูกต้อง (ctrl + f "จุดตัดของกล่อง (2D)")

มันใช้ SAT และมีรหัสแหล่งที่มาและบทความ


อัลกอริทึมที่อธิบายโดย geometrictools เป็นสิ่งที่ฉันอยากจะชี้ให้เห็น
Jari Komppa

ฉันได้รับสิ่งนี้เมื่อ 4 ปีที่แล้ว แต่มักจะอธิบาย downvote และทุกสิ่งที่ นี่น่ารักมาก "คำตอบของคุณอยู่ในปราสาทอื่น" และตอนนี้คำตอบก็ยังไม่ปรากฏในกรณีที่สอง
ยานน์

2

วิธีที่ง่ายกว่าน่าจะทดสอบจุดสุดยอดของกล่อง B กับแต่ละด้านของกล่อง A (คำนวณระยะทางที่เซ็นชื่อ) วิธีนี้คุณสามารถจำแนกจุดสุดยอดแต่ละจุดเป็น "ด้านหน้า" หรือ "หลัง" ส่วน

หากจุดสุดยอดของ B ทั้งหมดจัดว่าเป็น "ด้านหน้า" ของหนึ่งในกลุ่มของ A, B และ A ไม่ทับซ้อนกัน มิฉะนั้นพวกเขาทำ

สิ่งนี้มีส่วนเกี่ยวข้องดังนั้นคุณอาจได้รับประสิทธิภาพเพิ่มขึ้นโดยทำการตรวจสอบวงกลมเป็นวงกลมก่อนโดยใช้วงกลมที่มีขอบเขตของสี่เหลี่ยม (เล็กน้อยเพื่อคำนวณ)


ก่อนอื่นฉันทำการทดสอบขอบเขตกล่องที่มีการจัดแนวแกนเพื่อกำจัดวัตถุที่อยู่ไกลออกไปอย่างรวดเร็ว ... คุณมีรายละเอียดเพิ่มเติมเกี่ยวกับการทดสอบ quad-quad ไหม?
AshleysBrain

หมุนทั้งสี่ล่าวพร้อมกับการแปลงแบบเดียวกันโดยที่หนึ่งในนั้นถูกจัดแนวแกน ... แล้วใช้การทดสอบ SAT ตามที่กล่าวไว้ เมื่อพบผลลัพธ์ให้กลับการหมุนเพื่อให้ได้ผลลัพธ์
Steve H
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.