วิธีใดที่เหมาะสำหรับการจัดเก็บวัตถุทรงเรขาคณิตขนาดใหญ่ในควอดทรี


15

เมื่อวางวัตถุเรขาคณิตใน quadtree (หรือ octree) คุณสามารถวางวัตถุที่มีขนาดใหญ่กว่าโหนดเดี่ยวได้หลายวิธี:

  1. วางการอ้างอิงของวัตถุในทุก ๆ ใบไม้ที่มันมีอยู่
  2. วางการอ้างอิงของวัตถุในโหนดที่ลึกที่สุดซึ่งมันมีอยู่อย่างสมบูรณ์
  3. ทั้ง # 1 และ # 2

ตัวอย่างเช่น:

ป้อนคำอธิบายรูปภาพที่นี่

ในภาพนี้คุณสามารถวางวงกลมในโหนดใบไม้ทั้งสี่ (วิธี # 1) หรือในเพียงแค่โหนดรูท (วิธี # 2) หรือทั้งสองอย่าง (วิธี # 3)

สำหรับวัตถุประสงค์ในการสอบถามควอดทรีวิธีการใดเป็นเรื่องธรรมดามากขึ้นและทำไม?


1
แน่นอนควรอ้างอิง ฉันตั้งใจจะถามว่าเพื่อจุดประสงค์ในการสืบค้นควอดทรีควรมีการอ้างอิงในใบไม้ที่ไม่ใช่ใบไม้หรือทั้งสองอย่าง
nsantorello

PS แก้ไขเพื่อหวังว่าจะทำให้เจตนาของคำถามชัดเจนขึ้น
nsantorello

แบบสอบถามที่คุณพยายามสนับสนุนคืออะไร
Joe

@ Joe ฉันสนใจเป็นพิเศษในการตรวจจับการชนการสร้างดัชนีพิเศษและการเลือกภูมิภาค / frustum
nsantorello

1
@nsantorello กฎอาจจะแตกต่างกันขึ้นอยู่กับคำสั่งของคนที่คุณต้องการที่จะสนับสนุน แต่ดูเหมือนว่ามีความเกี่ยวข้องมากสำหรับการตรวจสอบการชน: stackoverflow.com/questions/4434335/...
โจ

คำตอบ:


8

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

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

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


ขอบคุณ Rafe ฉันคิดว่าคุณพูดถูกว่ามันขึ้นอยู่กับแอพพลิเคชั่น
nsantorello

6

ข้อดีอย่างหนึ่งของ Quadtree คือคุณไม่จำเป็นต้องแยกโหนดออกเป็นโหนดย่อยถ้าโหนดลูกทั้งหมดนั้นมีข้อมูลเดียวกัน สิ่งนี้สามารถประหยัดหน่วยความจำได้มากมายและทำให้การประมวลผลเร็วขึ้น

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

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

ดังนั้นฉันคิดว่าทั้งสองวิธีมีประโยชน์และฉันไม่แน่ใจว่าจะเลือกใช้วิธีใด

ฉันอาจจะไม่ใช้วิธีที่ # 3 เพราะฉันไม่เห็นข้อดีใด ๆ

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