卷内的对象

时间:2011-06-23 17:33:31

标签: algorithm bounding-volume space-partitioning

我有一个问题,我需要一种非常有效的方法来查找给定卷内的对象。可以想象,对象被表示为具有X-min,Y-min,Z-min和X-max,Y-max,Z-max值的框。空间中可能有数百万个这样的对象,问题是在任意给定的用户提供的卷内找到对象。用户输入框的X,Y和Z值的最小值,最大值。

目前,我在Oracle数据库表中拥有所有这些对象,这些对象的索引范围是X,Y和Z值。任何查询,找到对象然后涉及给定的X,Y和&的比较。 Z值与对象值的值。我发现性能并不令人满意,并且想到了一种内存算法来解决这个问题。此外,还需要找到完全进入,部分进入的对象。

由于 EY

2 个答案:

答案 0 :(得分:2)

有一种相对快速的方法可以查找轴对齐的边界框是否位于指定的边界体内,部分位于内部或内部。基本上,您可以为绑定比较的值分配位掩码,并通过ANDing位掩码确定边界框的交集。这正是你想要的,这是一种非常有效的方法;我记得多年前见过它(严肃地说,就像15年前一样);当我找到它时,我会发布参考资料和有关该方法的更多数据。

更新:好的,我认为我记得的原始方法不适用于这种精确的情况,但这有一个相对快速的解决方案。采用单维情况(您可以从中推广其他维度),如果该维度中的框的两个点都小于框最小值或者它们都大于框,则您希望该对象被取消资格最大。对每个尺寸重复,这将给你你想要的。

答案 1 :(得分:1)

不是一个非常优雅的解决方案,但我希望它是有效的。
它有一个初始化部分,需要一些时间,但它应该得到回报,查询将有望很快 首先创建一个空间分区数据结构,您可以使用它来搜索查询容器中的点,您将能够以这种方式找到这些框。
它将是一棵树,每个节点有8个孩子。还有其他选择,请看k-d trees

找到包含所有方框的最小封闭容器 将此容器分成8个大小相等的容器 对于集合中的每个点,找到它所属的容器 对每个包含多个点的容器重复此过程 你最终会得到一个单点的叶子容器。

使用此结构表示您要查找查询容器中的所有点 从树的顶部开始并遍历与查询容器相交的所有分支/容器 将有3个案例:
  1)容器完全封闭在被查询的容器内=>此子树中的所有点都在查询的容器中   2)容器在查询容器外面=>你不要遍历它。 (这是你应该获得效率的地方)
  3)容器与查询容器相交=>你必须为所有孩子重复这个过程 你需要弄清楚一些边缘情况。

要查找框,您必须将其8个角中的每个角放入该数据结构中 角落应该链接回盒子。所以当你找到一个角落时,你就会知道它属于哪个盒子。

要查找在查询过的容器中完全封闭的盒子,您必须测试每个找到的盒子