c++ - 如何使用冯·诺依曼邻域在 3D 空间中设置索引?

标签 c++ c algorithm

给定二维空间(网格)中的索引(x,y) 我可以通过冯·诺依曼邻域导出邻域索引:

http://en.wikipedia.org/wiki/Von_Neumann_neighborhood .

我如何最好地将这个概念扩展到三维空间(以最小的运行时复杂性) 使用冯·诺依曼邻域导出 (x,y,z) 的邻域索引?

有人可以帮我用一些伪/C 代码来说明它吗?

最佳答案

如果您谈论的是 6 个直接邻居,最有效的方法是对其进行硬编码:

int neighbour_offsets[3][6] = {
  {1, 0, 0},
  {0, 1, 0},
  {0, 0, 1},
  {-1, 0, 0},
  {0, -1, 0},
  {0, 0, -1},
};

对于等级 <= r 的邻居,对于固定尺寸嵌套 for循环将起作用:

for (x = -r; x <= r; ++x) {
    r_x = r - abs(x);
    for (y = -r_x; y <= r_x; ++y) {
        r_y = r_x - abs(y);
        for (z = -r_y; z <= r_y; ++z) {
            printf("%d, %d, %d\n", x, y, z);
        }
    }
}

如果你想要远处的邻居 d == r而不是d <= r ,使用z := {-r_y, r_y} .

对于任意低维,递归将起作用(并且相当清晰);对于高维,您最好从递归解决方案开始并将其转换为循环。在高维度 (D >> r) 中,大多数时候大多数维度的偏移量都将为零。

关于c++ - 如何使用冯·诺依曼邻域在 3D 空间中设置索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11210585/

相关文章:

c++ - 如何更改菜单项文本?

c++ - 使用 QProgressBar : Cannot create children for a parent that is in a different thread 时

c++ - 非类型引用参数/参数

c - 从结构中读取/写入位

algorithm - 如何计算边界矩形的宽度,以适应特定比例的文本包装?

algorithm - 规则空间分割

python - 许多数据帧上的高效 Python Pandas Stock Beta 计算

c++: 从 "const variable*"转换为 "uint32"失去精度

c - 行数之谜?

在 C 中调用 free()