การแยกทฤษฎีบทแกนด้วยหลายเหลี่ยม


9

ฉันพยายามที่จะใช้ทฤษฎีบทแกนแยกใน C # ฉันมีฟังก์ชั่นที่สามารถคำนวณเวกเตอร์การแปลขั้นต่ำระหว่างรูปหลายเหลี่ยมสองอัน อย่างไรก็ตามฉันไม่สามารถสร้างฟังก์ชันที่คำนวณเวกเตอร์การแปลขั้นต่ำได้ระหว่างรูปหลายเหลี่ยมหนึ่งกับรูปหลายเหลี่ยมอื่น ๆ สุจริตฉันได้ทำงานกับสิ่งนี้มาหลายเดือนแล้วและฉันก็ไม่ได้เข้าใกล้ทางออกและไม่สามารถหาวิธีแก้ปัญหาออนไลน์ได้ มีกรณีขอบบางอย่างที่ไม่ส่งคืนผลลัพธ์ที่ถูกต้องนำไปสู่ข้อบกพร่องที่มีลำดับความสำคัญสูงในเกมของฉัน

นี่คือกรณีขอบทั่วไปที่ทำงานไม่ถูกต้อง:

กรณีขอบ

มีวิธีแก้ไขปัญหาที่รู้จักกันดีสำหรับปัญหานี้หรือไม่? ทั้งหมดที่ฉันสามารถหาได้คือคนที่พูดว่า "แค่ทำ SAT ในรูปหลายเหลี่ยมแต่ละอัน" แต่นี่ไม่ค่อยจะสร้างเวกเตอร์การแปลขั้นต่ำ

ความช่วยเหลือใด ๆ จะได้รับการชื่นชมอย่างมาก


แนวความคิดหนึ่งที่ฉันไม่เคยทดสอบเลยจริงๆก็คือแกนแยกบางตัว - แกนที่จะย้ายคุณไปด้านข้างเป็นรูปหลายเหลี่ยมที่อยู่ติดกัน - อาจถูกตั้งค่าสถานะเพื่อไม่ถือว่าเป็นค่าต่ำสุด จากนั้นการทดสอบซ้ำบางประเภทจะให้ผลลัพธ์ที่ดี (อาจเป็นไปได้ด้วย FIFO และ / หรือขีด จำกัด การวนซ้ำบางชนิดเพื่อป้องกันการติดค้างในลูป)
Andrew Russell

ยิ่งยากที่จะแก้ปัญหาเวอร์ชันนี้คือเมื่อขอบของรูปร่างถูกปกคลุมเพียงบางส่วนโดย annother ตัวอย่างเช่นในภาพด้านบนขวาถ้าสี่เหลี่ยมกลางขยายออกไปทางขวาเพื่อเป็นรูปสี่เหลี่ยมผืนผ้าที่มีขนาดใหญ่ขึ้น นี่คล้ายกับผลลัพธ์ของโค้ดบางส่วนที่ฉันใช้ซึ่งใช้เซลล์ที่ถูกครอบครอง / ไม่ได้ครอบครองนับหมื่นและลดขนาดเซลล์ลงให้มีขนาดใหญ่กว่าหนึ่งร้อยครั้ง
Richard Tingle

คำตอบ:


2

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

ความจริงที่ว่าตัวแก้ไขหรือเครื่องมือของคุณใช้รูปร่างที่เล็กลงและเป็นบุคคลเพื่อสร้างระดับไม่ควรกระทบกับรันไทม์

วิธีที่ง่ายกว่าเล็กน้อยเพียงแค่ลบขอบ "ด้านใน" ของรูปร่างฐาน สำหรับตัวอย่างสุดท้ายของคุณมีสองขอบระหว่างกล่อง "floor" ละเว้นสิ่งเหล่านี้ระหว่างการตรวจจับการชนกันของข้อมูล

คุณสามารถค้นหาภาพที่ดีขึ้นบางส่วนและบางความคิดการดำเนินงานโดยการอ่านส่วน 4.5 (ขอบและโซ่ขอบ) ในเอกสาร Box2D


2
การใช้ขอบ (โดยเฉพาะขอบจะดีกว่าเล็กน้อยกับขอบโซ่) มีข้อเสียที่สำคัญคือมันกลายเป็นเรื่องง่ายสำหรับวัตถุฟิสิกส์ที่จะผิดพลาดภายในรูปทรงเรขาคณิตระดับ
Andrew Russell

1
@AndrewRussell: ปัญหาเหล่านี้หลีกเลี่ยงได้ด้วยการแก้ไขทันเนลตามปกติ ตรวจสอบให้แน่ใจว่าวัตถุที่เคลื่อนไหวของคุณมีปริมาตร / พื้นที่ที่เหมาะสมพอสมควรรักษาความเร็วสูงสุดต่อเฟรมไว้ต่ำพอดังนั้นพวกเขาจึงไม่สามารถเคลื่อนที่ได้มากกว่าครึ่งหนึ่งของมิติที่สั้นที่สุด (หรือก้าวหลาย ๆ ครั้งถ้าคุณต้องการให้มันเคลื่อนที่เร็วขึ้น) รอยแยกที่คมชัดจริงๆและในเรขาคณิตระดับของคุณย้ำความละเอียดหลาย ๆ ครั้งจนกว่าคุณจะมาบรรจบกันในตำแหน่งสุดท้ายที่ "ปลอดภัย" ฯลฯ
Sean Middleditch
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.