Büyük geometrik nesneleri dörtlü bir yerde saklamak için hangi yöntem tercih edilir?


15

Dörtlü (veya oktree) geometrik nesneleri yerleştirirken, tek bir düğümden daha büyük nesneleri birkaç şekilde yerleştirebilirsiniz:

  1. Nesnenin referansını bulunduğu her yaprağa yerleştirmek
  2. Nesnenin referansını, tam olarak bulunduğu en derin düğüme yerleştirme
  3. Hem # 1 hem de # 2

Örneğin:

resim açıklamasını buraya girin

Bu görüntüde, daireyi yaprak düğümlerinin dördüne (yöntem # 1) veya yalnızca kök düğüme (yöntem # 2) veya her ikisine (yöntem # 3) yerleştirebilirsiniz.

Dörtlü sorgulamak için hangi yöntem daha yaygındır ve neden?


1
Kesinlikle bir referans olmalı. Dörtlü sorgulamak için yapraklarda, yapraklarda veya her ikisinde de referanslar olup olmadığını sormak istiyorum.
nsantorello

PS Sorunun niyetlerini daha net hale getirmek için düzenlendi.
nsantorello

Desteklemeye çalıştığınız sorgu nedir?
Joe

@Joe Özellikle çarpışma tespiti, uzaysal indeksleme ve bölge / frustum ayıklaması ile ilgileniyorum.
nsantorello

1
@nsantorello Kural, hangi sorguları desteklemek istediğinize bağlı olarak farklı olabilir, ancak bu çarpışma tespiti için çok alakalı görünmektedir: stackoverflow.com/questions/4434335/…
Joe

Yanıtlar:


8

Nesnenin kendisini değil, bir referansı sakladığınızı varsayarsak, uygulamanıza bağlı olarak bunu farklı yapmak mantıklı olabilir.

Örneğin, bu (katı) daire ile çarpışmalar hesaplıyorsanız ve çarpışma sol alt köşede gerçekleşiyor olsaydı, o yapraktaki tüm geometriye doğrudan o yapraktan erişebilseydiniz daha kolay olurdu (yöntem # 3) (ağacı yukarı doğru hareket ettirmek ve kalıtsal geometriyi belirlemek zorunda kalmadan). Ancak, geometri çizmek için sadece dörtlü kullandığınızı, yöntem # 1'i kullanmak istediğinizi varsayalım, çünkü yalnızca tam olarak bulunduğu düğümde bir şey çizmek mantıklıdır (hangi kısmı bulmak daha zor olacaktır) her bir yaprak düğümü ve nerede çizmek için).

Daha sıradan olanlara gelince, quadtrees ile tek deneyimim, geometrik nesnelerin gerçekten sadece alanı olmayan noktalar olduğu bir n-vücut simülasyonu yazmaktır, bu yüzden buna kesin olarak cevap veremem.


Teşekkürler Rafe, bence bu uygulamaya bağlı.
nsantorello

6

Bir Quadtree'nin avantajlarından biri, tüm alt düğümler aynı bilgileri içeriyorsa, bir düğümü alt düğümlerine bölmeniz gerekmemesidir. Bu size çok fazla bellek tasarrufu sağlayabilir ve işlemeyi daha hızlı hale getirebilir.

Bu prensibe göre, sadece kök düğümde (yöntem # 2) saklamanın daha mantıklı olduğunu düşünüyorum. Bu size çok fazla bellek tasarrufu sağlayabilir ve bence işlemeyi de kolaylaştırır. Örneğin, üç yaprak düğümünden geçen bir çizgiyle dairenin kavşaklarını bulmaya çalışırsanız, her bir yaprak düğümü için kavşağı ayrı ayrı hesaplamanız veya bu daireyle zaten kesiştiğinizi hatırlamanız gerekir.

Öte yandan, yaprak düğümlerinde nesneleriniz varsa, yanlış pozitifleri (kavşak için kontrol etmeniz gereken nesneler, çünkü doğru düğümde oldukları, ancak aslında kesişmediği) ortadan kaldırmanıza yardımcı olabilir.

Bu yüzden, her iki yaklaşımın da kullanımları olduğunu düşünüyorum ve hangisinin kullanılacağını nasıl seçeceğimi bilmiyorum.

Muhtemelen # 3 yaklaşımını kullanmazdım, çünkü bununla ilgili olumlu bir şey görmüyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.