Geometry 球面上的均匀空间容器

Geometry 球面上的均匀空间容器,geometry,computational-geometry,spatial,nearest-neighbor,Geometry,Computational Geometry,Spatial,Nearest Neighbor,是否有在(3D)球体表面上工作的空间查找网格或装箱系统?我有以下要求: 箱子必须是均匀的(因此,如果在给定常数r的情况下,存在一个距离球体上任何点r距离的点,您可以在恒定时间内查找)† 存储箱的数量最多必须与球体的表面积成线性关系。(或者,增加栅格的曲面分辨率不应使其增长快于其映射的区域。) 我已经考虑过了 球坐标:不好,因为创建的单元极不均匀,无法进行接近测试 :失真小于球坐标,但仍很难确定要搜索给定查询的单元格 三维体素装箱:使用永远不会使用的空箱子(以及边界立方体6个角处的空箱子)浪

是否有在(3D)球体表面上工作的空间查找网格或装箱系统?我有以下要求:

  • 箱子必须是均匀的(因此,如果在给定常数
    r
    的情况下,存在一个距离球体上任何点
    r
    距离的点,您可以在恒定时间内查找)†

  • 存储箱的数量最多必须与球体的表面积成线性关系。(或者,增加栅格的曲面分辨率不应使其增长快于其映射的区域。)

我已经考虑过了

  • 球坐标:不好,因为创建的单元极不均匀,无法进行接近测试

  • :失真小于球坐标,但仍很难确定要搜索给定查询的单元格

  • 三维体素装箱:使用永远不会使用的空箱子(以及边界立方体6个角处的空箱子)浪费球体的整个内部体积。空间需求随着球体表面积的增加而增加

  • kd树:在3D中表现不佳,技术上是对数复杂度,不是每个查询的常数

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



†值得注意的是,点具有最小间距,因此良好的网格确实可以保证不断查找。

我的建议是球面坐标的一种变体,这样极角不会均匀采样,而是该角度的正弦均匀采样。这样,面积sinφdφdΘ的元素保持不变,从而形成相同面积的瓷砖(尽管纵横比可变)

在极点处,将所有平铺合并为一个圆盘状多边形


另一种可能性是将一个规则的二十面体投影到球体上,并对由此获得的球面三角形进行三角化。这需要一点球面三角学。

我有一个类似的问题,并使用了“稀疏”三维体素组合。基本上,我的空间索引是从
(x,y,z)
坐标到容器的散列映射

因为我对我的点也有一个最小距离约束,所以我选择了箱子大小,这样箱子最多可以包含一个点。如果(立方体)料仓的边缘最多为
d/sqrt(3)
,其中
d
是球体上两点的最小间距,则可实现此目的。其优点是,您可以将一个完整的bin表示为一个点,而散列映射中可以不存在一个空bin

我唯一的查询是半径
d
(相同的
d
)内的点,然后需要扫描周围的125个箱子(一个5×5×5的立方体)。从技术上讲,你可以去掉8个弯角,把这个降到117,但我没有费心

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


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

也许a会有所帮助,虽然我不确定如何在三角形子网格中执行次线性查询。@Meowgoethedog六边形网格是非均匀的,并且有许多与球体化立方体网格相同的问题。(是的,我知道球体表面上不存在统一的网格,但我不在乎网格是否严格限制在曲面上,即包围曲面的立方体体素很好。这些点存储为3D点,限制为
x^2+y^2+z^2==1
)六角网格,或者他们的双三角形测地网格,听起来像是最好的整体解决方案,即使单元并不完全一致。我发现在查看不同的细分之间的关系方面特别有用。@MvG如果要查找距离查询较远的东西
r
如何确定要搜索的网格单元?@taylorswift:Dunno,类似于宽度优先搜索比r近的邻居可能是最简单的。我想你可以想出更奇特的东西,但对于常数r,即使是最愚蠢的算法也是O(1)。如果这还不够,您需要一种更好的方式来表达您在性能/简单性方面的需求。但我没有一个优雅的查找例程,这就是为什么这是一个评论而不是一个答案。你能详细说明吗?@taylorswift:详细说明什么?这怎么能用于实施恒定时间接近测试?看起来,即使瓷砖的面积是均匀的(而且你没有提供足够的细节来证明情况是均匀的),它们的尺寸也不会是均匀的,这是接近度的相关因素testing@taylorswift:通过计算球面角度,在恒定时间内确定点投影的位置。网格是规则的。如何确定要搜索哪些单元格以查找距离
r
内的点?它是一个常数吗?因为如果我理解你描述的网格,细胞越靠近北极或南极,越高越窄,这意味着许多点可能在同一个细胞中。对于规则晶格,如果我们知道点之间的距离不小于
u
,则可以将栅格间距设置为
u/sqrt(3)
,以保证每个单元最多1个点