哪种方法更适合在四叉树中存储大型几何对象?


15

在四叉树(或八叉树)中放置几何对象时,可以通过以下几种方式放置比单个节点大的对象:

  1. 将对象的引用放置在包含该对象的每个叶子中
  2. 将对象的引用放置在完全包含对象的最深节点中
  3. #1和#2

例如:

在此处输入图片说明

在此图像中,您可以将圆放置在所有四个叶节点(方法1)中,或者仅放置在根节点(方法2)中,或同时放置在两个节点中(方法3)。

为了查询四叉树,哪种方法更常见?为什么?


1
当然应该作为参考。我打算问,为了查询四叉树,在叶子,非叶子或两者中都应该有引用。
nsantorello,2012年

PS编辑,希望可以使问题的意图更加清楚。
nsantorello,2012年

您要支持的查询是什么?
2012年

@Joe我对碰撞检测,空间索引和区域/视锥剔除特别感兴趣。
nsantorello,2012年

1
@nsantorello根据要支持的查询的不同,规则可能有所不同,但这似乎与冲突检测非常相关:stackoverflow.com/questions/4434335/…– 2012

Answers:


8

假设您存储的是引用而不是对象本身,则根据您的应用程序不同地执行此操作可能很有意义。

例如,如果您正在计算与该(实心)圆的碰撞,并且碰撞发生在左下角,那么直接从该叶片访问该叶片中的所有几何图形会更容易(方法3) (而不必向上遍历树并确定继承的几何形状)。但是,假设您只是使用四叉树绘制几何图形,则想使用方法#1,因为只有在完全包含它的节点中绘制某些东西才有意义(要弄清楚哪一部分是比较困难的)为每个叶节点和位置绘制)。

至于更常见的情况,我对四叉树的唯一经验是编写n体模拟,其中几何对象实际上只是没有面积的点,因此我无法确切地回答。


感谢Rafe,我认为这取决于应用程序是正确的。
nsantorello,2012年

6

四叉树的优点之一是,如果所有子节点都包含相同的信息,则不必将一个节点拆分为其子节点。这样可以节省大量内存,并使处理速度更快。

遵循这一原则,我认为将其仅存储在根节点中(方法2)更为有意义。它可以为您节省大量内存,并且我认为这也将使处理变得更容易。例如,如果您尝试找到一条与穿过三个叶节点的线的圆的交点,则可能需要分别为每个叶节点计算交点,或者记住已经与该圆相交了。

另一方面,如果在叶节点中有对象,则可以帮助您消除误报(您必须检查相交的对象,因为它们在正确的节点中,但实际上没有相交)。

因此,我认为这两种方法都有其用途,我不确定如何选择要使用的方法。

我可能不会使用方法3,因为我看不到任何正面评价。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.