【问题标题】:Uniform spatial bins on surface of a sphere球体表面上的均匀空间箱
【发布时间】:2018-10-21 02:40:39
【问题描述】:

是否有适用于(3D)球体表面的空间查找网格或分箱系统?我有这样的要求

  • 分箱必须是统一的(因此,如果存在一个点 r 距球体上的任何点的距离,给定常数 r,则您可以在常数时间内查找。)†支持>

  • bin 的数量最多必须与球体的表面积成线性关系。 (或者,增加网格的表面分辨率不应使其增长速度超过其映射的区域。)

我已经考虑过了

  • 球坐标:不好,因为创建的单元非常不均匀,因此无法用于邻近测试。

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

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

  • kd-Trees:在 3D 中表现不佳,并且在技术上具有对数复杂性,而不是每次查询都保持不变。

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


值得的是,点有一个最小间距,所以一个好的网格确实可以保证持续查找。

【问题讨论】:

  • 也许hexagonal spherical grid 会有所帮助,尽管我不确定如何在三角形子网格中执行子线性查询。
  • @meowgoesthedog 六边形网格是不均匀的,并且有许多与球形立方体网格相同的问题。 (是的,我知道球体表面上可能存在 no 均匀网格,但我不在乎网格是否严格限制在表面,即包围的立方体体素表面很好。点存储为 3D 点,限制为 x^2 + y^2 + z^2 == 1)
  • 六边形网格,或者它们的双重网格,即三角形测地线网格,听起来像是总体上最好的解决方案,即使单元格并不完全一致。我发现stackoverflow.com/a/3033370/1468366 在查看不同的细分如何相互关联时特别有用。
  • @MvG 如果要查找r 与查询之间的距离,如何确定要搜索的网格单元格?
  • @taylorswift:不知道,像广度优先搜索比 r 更近的邻居可能是最简单的。我想你可以想出更多奇特的东西,但是对于常量 r,即使大多数愚蠢的算法也是 O(1)。如果这还不够,您需要一种更好的方式来表达您在性能/简单性方面的需求。但事实上我没有优雅的查找例程,这就是为什么这是评论而不是答案。

标签: geometry computational-geometry spatial nearest-neighbor


【解决方案1】:

我的建议是球坐标的变体,这样极角不会被均匀采样,而是这个角度的正弦被均匀采样。这样,面积元素 sinφ dφ dΘ 保持不变,导致相同面积的图块(尽管纵横比可变)。

在两极,将所有图块合并成一个圆盘状多边形。

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

【讨论】:

  • 你能详细说明一下吗?
  • @taylorswift:详细说明什么?
  • 如何使用它来实现恒定时间接近测试?似乎即使瓷砖的面积是均匀的(而且你没有提供足够的细节来证明情况如此),它们的尺寸也不会是均匀的,这是接近测试中的相关因素
  • @taylorswift:通过计算球面角,在恒定时间内确定点投影的瓦片。网格是规则的。
  • 如何确定要搜索哪些单元格以查找距离r内的点?它甚至是一个常数吗?而且因为如果我理解您所描述的网格,单元格会变得更高但越靠近北极或南极越窄,这意味着许多点可能在同一个单元格中。对于规则格子,如果我们知道这些点的距离不小于u,则可以将网格间距设置为u/sqrt(3),以保证每个单元格最多1 个点
【解决方案2】:

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

因为我的点也有最小距离限制,所以我选择了 bin 大小,使得 bin 最多可以包含一个点。如果(立方)箱的边缘最多为d / sqrt(3),则可以完成此操作,其中d 是球体上两点的最小间隔。优点是您可以将一个完整的 bin 表示为一个点,而一个空的 bin 可以不出现在 hash map 中。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-30
    • 2012-03-24
    • 2012-02-08
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    相关资源
    最近更新 更多