如何确定一个点所在的长方体而不重复它们?

时间:2009-07-21 12:14:15

标签: search language-agnostic geometry fuzzy-search space-partitioning

我有一些长方体,其位置和大小以最小和最大xyz坐标给出(因此它们与主轴平行)。

e.g。我可能有以下3个长方体:

10.5 <= x <= 39.4,  90.73 <= y <= 110.2, 90.23 <= z <= 95.87
20.1 <= x <= 30.05,  9.4  <= y <=  37.6,  0.1  <= z <= 91.2
10.2 <= x <= 10.3,   0.1  <= y <=  99.8, 23.7  <= z <= 24.9

如果我给出一个观点(例如(25.3,10.2,90.65)),有没有办法快速确定我所在的哪个长方体?

  • 显然我可以迭代所有的长方体,但是它们可能有数百万个,我需要它比简单的迭代更快(O(log n)或更好的东西会很棒)。

  • 这听起来像是一个“模糊匹配”类型的问题,而且我注意到Apache Lucene支持range queries,但这似乎是相反的方式(找到一个点长方体而不是包含点的长方体。

  • 为了使问题稍微复杂一点,尺寸的数量可能会大于3(可能会增加20);也就是说,我可能正在寻找“超音速”而非长方体。)

2 个答案:

答案 0 :(得分:2)

你进入“二元空间划分”和“碰撞检测”领域;基本上这些想法基本上是将长方体存储成树型结构,将它们占据的空间分成整齐的小盒子。关于每个长方体占据哪个“部分空间”的决定是在插入树形结构期间做出的。

在八月份进行谷歌搜索。

精确划分3D空间,并且该空间中包含的对象是计算机科学的重要组成部分;主要用于电脑游戏的开发。一些算法考虑了时间因素,即对象在分区空间之间移动。

答案 1 :(得分:1)

加速此查询的一种简单方法是构建以下统一网格数据结构(通常称为分箱)作为预处理步骤:在您的网格上放置一个n x n x n(在3d中)网格场景并且对于网格的每个单元存储指向与该单元格相交的所有长方体的指针。现在,对于查询点,您可以直接计算它在统一网格中的哪个单元格,然后您只需要检查与该单元格关联的长方体,而不是所有长方体。

根据空间的大小以及长方体大小的变化,这种方法可能效率不高,因为您可能很难选择良好的n分辨率来加速,而不需要大量的细胞。为了克服这个问题,您可能希望尝试更加自适应的方式来划分空间,例如 kd-trees (kd-trees at wikipedia),它们基本上是用轴对齐平面划分空间的二叉树:在这里看一个例子,红色平面将盒子分成两部分,然后是较小部分的绿色,然后是蓝色...

kd-tree

使用kd-tree的查询首先遍历查询点所在的kd-tree的叶子,然后检查该单元格中的局部长方体。 可以找到其他空间分区数据结构选项here

另一种选择是使用边界卷层次结构,它将对象组合在边界卷中,然后将边界卷分组到更大的边界卷中,依此类推......以获得边界卷的层次结构。这些可以更好地适应场景,并且可以更轻松地处理对象移动的场景,但我认为您的设置空间分区可以很好地工作......无论如何,有关更多详细信息,请参阅this book chapter