我有一个问题,我需要一种非常有效的方法来查找给定卷内的对象。可以想象,对象被表示为具有X-min、Y-min、Z-min和X-max、Y-max、Z-max值的框。太空中可能有数百万个这样的物体,问题是在任意给定的用户提供的体积中找到这些物体。用户输入框的X、Y和Z值的最小值、最大值。
目前,我在Oracle数据库表中拥有所有这些对象,这些对象都是针对X、Y和Z值进行范围索引的。任何查找对象的查询都涉及对给定的X、Y和amp;Z值与对象值的Z值。我发现性能不尽如人意,于是想到了一种内存算法来解决这个问题。此外,所需的是找到完全在中、部分在中的对象。
谢谢Ey
有一种相对快速的方法可以找到与轴对齐的边界框是否位于指定的边界体积内、部分位于指定边界体积内或不位于指定边界空间内。基本上,您可以为绑定比较的值指定一个位掩码,并通过与位掩码进行and运算来确定边界框的交集。这正是你想要的,这是一种非常有效的方法;我记得很多年前(说真的,就像15年前)看过它;当我找到它时,我会发布参考资料和更多关于该方法的数据。
更新:好吧,我想我记得的最初方法不是针对这种精确的情况,但这有一个相对快速的解决方案。以一维为例(从中可以概括其他维度),如果该维度中长方体的两个点都小于长方体的最小值,或者都大于长方体的最大值,则希望对象被取消资格。对每个维度重复此操作,就会得到所需的结果。
不是一个非常优雅的解决方案,但我希望它是高效的
它有一个初始化部分,这将需要一些时间,但它应该会得到回报,希望查询会很快
首先创建一个空间分区数据结构,使用它可以在查询的容器中搜索点,这样就可以找到框
它将是一棵树,每个节点有8个子节点。还有其他选择,看看k-d树
找到包含所有框的最小封闭容器
把这个容器分成8个大小相等的容器
对于集合中的每个点,找到它所属的容器。
对每个包含多个点的容器重复此过程。
最终,叶子容器只有一个点。
使用此结构表示您希望在查询的容器中查找所有点
从树的顶部开始,遍历与查询的容器相交的所有分支/容器
将有3种情况:
1) 一个容器被完全封闭在被查询的容器中=>这个子树中的所有点都在被查询容器中
2) 一个容器在被查询的容器之外=>你不需要遍历它。(这是你应该获得效率的地方)
3) 一个容器与查询的容器相交=>您必须对它的所有子容器重复该过程
有些边缘情况你必须弄清楚。
要找到这些方框,你必须将它们的8个角中的每一个放在数据结构中
角落应该连接回盒子。所以当你找到一个角落时,你就会知道它属于哪个盒子
要找到查询的容器中完全包含的盒子,您必须测试找到的每个盒子