Algorithm 卷内的对象

Algorithm 卷内的对象,algorithm,bounding-volume,space-partitioning,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值与对象值进行比较。我发现性能并不令人满意,于是想到了一种内存算法来解决这个问题。此外

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

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

谢谢
Ey

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


更新:好吧,我想我记得的最初的方法并不是针对这种精确的情况,但这有一个相对快速的解决方案。以一维为例(从中可以概括其他维度),如果该维度中长方体的两个点都小于长方体的最小值或都大于长方体的最大值,则希望该对象不合格。对每个维度重复此操作,这将满足您的要求

不是一个非常优雅的解决方案,但我希望它是有效的。
它有一个初始化部分,这需要一些时间,但这样应该会有回报,查询速度有望更快。
首先创建一个空间分区数据结构,您可以使用它在查询的容器中搜索点,这样您就可以找到框了。
它将是一棵树,每个节点有8个子节点。还有其他的选择,看看吧

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

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

要找到这些框,您必须将它们的8个角分别放在该数据结构中。
角落应该链接回盒子。所以当你找到一个角落,你就会知道它属于哪个盒子


要找到哪些框完全包含在查询的容器中,您必须测试找到的每个框

谢谢,如前所述,如果您能提供任何参考,这将非常有帮助。我目前在Oracle中的算法大致相同,但对于一百万个对象,这种方法效率非常低。x、y、z整数是吗?他们的范围有多大?看起来很有趣,我将尝试这种方法,看看它是如何工作的。谢谢