球体表面上的均匀空间区间

时间:2018-05-10 18:37:58

标签: geometry computational-geometry spatial nearest-neighbor

是否存在可在(3D)球体表面上工作的空间查找网格或分级系统?我有

的要求
  • 垃圾箱必须是均匀的(如果距离球体上的任何点都有r距离,您可以在恒定时间内查找,给定常数r。)

  • 箱的数量必须与球体的表面积最为线性。 (或者,增加网格的表面分辨率不应使其比其绘制的区域增长得快。)

我已经考虑了

  • 球面坐标:不好,因为所创建的细胞非常不均匀,无法进行接近性测试。

  • Cube meshes:比球面坐标更少失真,但仍然很难确定要搜索给定查询的单元格。

  • 3D体素分级:使用永不使用的空箱(以及边界立方体的6个角处的空箱)浪费球体的整个内部体积。随着球体表面积的增加,空间需求随着O(n sqrt(n))的增长而增长。

  • kd-Trees:在3D中表现不佳,在技术上是对数复杂度,而不是每个查询不变。

我对解决方案的最好想法是使用3D体素分箱方法,但不知何故排除了球体永远不会相交的体素。但是我不知道如何确定要排除哪些体素,也不知道如何在球体上给定查询位置的情况下计算这种结构的索引。

对于这些点而言,这些点具有最小间距,因此良好的网格确实可以保证不断查找。

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,并使用了“稀疏” 3D体素合并。基本上,我的空间索引是从(x, y, z)坐标到bin的哈希图。

因为我的点也有最小距离限制,所以我选择了bin大小,以便bin最多可以包含一个点。如果(三次)箱的边缘最多为d / sqrt(3),其中d是球面上两个点的最小间隔,则可以完成此操作。优点是您可以将一个完整的bin表示为一个点,而散列图中就可以不存在一个空bin。

我唯一的查询是在半径d(相同的d)内的点,然后需要扫描周围的125个仓(5×5×5立方体)。从技术上讲,您可以从8个弯角离开,将其降低到117,但我没有打扰。

bin大小的另一种选择是针对查询优化它,而不是优化存储大小和简单性,并选择它以使您始终必须最多扫描27个bin(3×3×3立方体)。这将需要d的bin边缘长度。我认为(但并没有对此进行认真思考)在这种情况下,垃圾箱最多可以包含4点。您可以用固定大小的数组表示它们,以保存一个指针间接。

在任何一种情况下,您的空间索引的内存使用量将是O(n)个点的n,因此没有比这更好的了。