给定二维空间(网格)中的索引(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/