QuadTree: เก็บคะแนนเท่านั้นหรือภูมิภาค?


9

ฉันกำลังพัฒนาควอดทรีเพื่อติดตามวัตถุที่เคลื่อนไหวเพื่อตรวจจับการชน วัตถุแต่ละชิ้นมีรูปร่างที่ล้อมรอบสมมติว่าพวกมันเป็นวงกลมทั้งหมด (มันเป็นเกมจากบนลงล่าง 2D)

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

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

การปะทะกันระหว่างวัตถุจากโหนดใกล้เคียง

หากทำงานกับภูมิภาคจะจัดการกับวัตถุที่ครอบคลุมหลายโหนดได้อย่างไร ควรแทรกในพาเรนต์โหนดที่ใกล้ที่สุดซึ่งมีทั้งหมดแม้ว่าจะเกินความจุของโหนดหรือไม่

โหนดใดควรมีวัตถุสีแดง

ขอบคุณ

คำตอบ:


4

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

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

ในการค้นหาพื้นที่หนึ่ง ๆ เคียวรีควรดูโหนดปลายใบไม้ทั้งหมดที่สัมผัสกับภูมิภาคที่ถูกสอบถาม

โดยพื้นฐานแล้วใช้อัลกอริธึมเดียวกันซึ่งเริ่มต้นด้วยพื้นที่และกดลงบนต้นไม้เพื่อค้นหาโหนดใบที่สัมผัส มันเป็นการสำรวจเส้นทางที่ลึกเป็นอันดับแรก แต่ในแต่ละโหนดคุณสามารถตัดลูก ๆ ที่ไม่แตะต้องภูมิภาคได้ คุณจะต้องรักษากองไว้เพื่อติดตามตำแหน่งที่คุณอยู่ในเส้นทางสำรวจ


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

4

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


2

ฉันจะเพิ่มนี่เป็นความคิดเห็นในการตอบสนองต่อคำตอบของ @Nathan Reed ยกเว้นว่ามันใหญ่เกินไปที่จะแสดงความคิดเห็นและบางทีในกรณีใด ๆ ที่สมควรที่จะเป็นคำตอบที่แยกต่างหาก

เรากำลังทำสิ่งที่ถูกต้องในคำตอบของเขาและในความเป็นจริงมีความคิดเห็นในแหล่งที่มาที่เชื่อมโยงไปยังหน้านี้ ส่วนใหญ่ทำงานได้ดีมากยกเว้นว่าทุกๆสองหรือสามเดือนเราได้สูญเสียเซิร์ฟเวอร์โดยการสุ่มที่ไม่ตอบสนองเนื่องจากมีข้อความค้นหาจำนวนมาก

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

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

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

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

ไมล์สะสมจริงของคุณอาจแตกต่างกันไป

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