是否存在可在(3D)球体表面上工作的空间查找网格或分级系统?我有
的要求垃圾箱必须是均匀的(如果距离球体上的任何点都有r
距离,您可以在恒定时间内查找,给定常数r
。)†
箱的数量必须与球体的表面积最为线性。 (或者,增加网格的表面分辨率不应使其比其绘制的区域增长得快。)
我已经考虑了
球面坐标:不好,因为所创建的细胞非常不均匀,无法进行接近性测试。
Cube meshes:比球面坐标更少失真,但仍然很难确定要搜索给定查询的单元格。
3D体素分级:使用永不使用的空箱(以及边界立方体的6个角处的空箱)浪费球体的整个内部体积。随着球体表面积的增加,空间需求随着O(n sqrt(n))
的增长而增长。
kd-Trees:在3D中表现不佳,在技术上是对数复杂度,而不是每个查询不变。
我对解决方案的最好想法是使用3D体素分箱方法,但不知何故排除了球体永远不会相交的体素。但是我不知道如何确定要排除哪些体素,也不知道如何在球体上给定查询位置的情况下计算这种结构的索引。
†对于这些点而言,这些点具有最小间距,因此良好的网格确实可以保证不断查找。
答案 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
,因此没有比这更好的了。