我有一个号码的体的位置和大小都给予最小和最大 x, yz 坐标(以便他们是平行的主要轴).

例如我可能会具有下列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))是否有种方式,迅速确定其立方体(s)我?

  • 很显然,我可能只是迭代所有的体,但也有可能是数以百万计的人,我需要这个去的速度比简单的迭代(东西O(日志n)或更好的将是巨大的).

  • 这听起来对我像一个"模糊匹配"类型的问题,我注意到 Apache分类:设 支持 范围内查询, 但这似乎工作的相反的方式圆(找到一个点,在一个立方体,而不是一个立方体含有一点)。

  • 稍微复杂事项进一步,维数可能会大于3(它可能高达20);即我可能会寻找"hypercuboids",而不是体.)

有帮助吗?

解决方案

一个简单的方法来加速这种查询是通过建立以下 统一格 数据结构(通常被称为箱)作为一个预处理步骤:把一个 n x n x n (3d)网在你的场景,对于每一个小的格栅存储指的所有体的交叉。现在,对于一个查询点你可以的计算直接在单元是在统一格,然后你必须检查仅体相关的小区,不是所有的体.

根据空间是多大和多不同的方尺寸是这种方法可能不是非常有效,因为你可能难以选择了一个很好的 n 决议加速足够,并不需要大量的细胞。为了克服这你可能会想试试看到更多的适应方式分隔的空间,例如 kd-树木 (kd-树木在维基百科), ,这基本上是二进制的树木分区的空间与轴排列的飞机:看看这里的一个例子里的红色飞机分的框成两部分,那么绿色的,在较小的部分,那么蓝色的...

kd-tree

查询使用kd树会第一遍下降到叶的kd树那里的查询点的位置,然后请与当地体在该单元。 其他空间划分的数据结构 选项可以找到 在这里,.

另一个选择是使用 边界积层次结构, ,其组对象一起,在边界卷,然后组边界卷入较大的边界卷。得到一个层次结构的边界卷。这些更好地适应现场,并可以更容易处理的场景在哪里的对象的移动,但我想为你设定的空间划分的可能工作的好...不管怎么说,欲了解更多详情,请参阅 这本书的章节.

其他提示

你近乎进入的领土"二元的空间分区"和"碰撞探测";基本的想法基本上都是储存体成树的种类结构,它将该空间,他们占到整洁的小盒。决定关于其"部分的空间"每一方占据的是议期间插入树的结构.

做一个谷歌上搜索Octrees.

流水作业划分的3D空间,并对象包含在内,空间是一个相当大部分的计算机科学;大多用于发展的计算机游戏。一些算法考虑到时间因素,即该物体移动的间隔空间。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top