通过Z阶曲线半径最近的邻居?

计算科学 算法 开放式 最近邻 空间数据 粒子
2021-12-21 03:13:48

给定一个 3D 立方体网格,我如何将 3D 网格坐标映射到 1D 坐标,以便每个单元格的最近邻居可以由相应的 1D 值的连续范围表示?M×M×MC

3D 到 1D 映射之一可能是 Z 索引,但我不知道如何以我上面描述的方式访问邻居。


为什么我需要这个:我正在编写一个处理粒子的 OpenCL 内核函数。在网格的每个单元格中,可以是任意(非负:)数量的粒子。粒子存储在内存中,按由一维坐标给出的单元格 ID 排序。并且为了在读取邻居时获得最佳 GPU 性能,我需要相邻粒子在内存中接近(即在空间中彼此接近的网格单元的 1D 坐标也接近)。C

如果你想要更多的上下文,你可以在不同的 SE 网站上看到我的问题:

1个回答

您要问的问题是不可能的,因为您无法以邻居始终在连续范围内的方式对所有单元格进行排序。假设我们尝试在 3D 中构建连续的邻居列表。每个内部单元格有六个邻居,因此它应该在邻居列表中出现六次。构造六个连续邻居列表的唯一方法如下:Ci

  • Ci5Ci
  • Ci4Ci+1
  • ..
  • CiCi+5

这些列表包含 11 个不同的单元格。的左右 -neighbor在它们的邻居列表中已经有不同的单元格(它们唯一的共享邻居是)。因为也有邻居,所以我们不能有连续的邻居列表。xCi5+5+1=11Ciyz

您可以改为为每个单元计算一个莫顿数(即,使用 Z 曲线),然后将这些数字存储在排序的一维数组中。时间内计算邻居的莫顿数时间内进行二进制搜索,其中是单元格的数量。miO(1)O(logN)N