如何计算扁平化(1D)3D数组中任意指定索引的相邻索引
扁平化三维数组的相邻索引计算方法
核心思路
要计算扁平索引的相邻索引,核心是先把扁平索引转换为三维坐标,再生成六个方向的相邻坐标,最后转回扁平索引并过滤无效值。
1. 明确数组的扁平化顺序
假设你的数组是按 X轴→Y轴→Z轴 的顺序扁平化的(即先遍历X方向所有元素,再遍历Y方向,最后遍历Z方向),这和你给出的示例完全匹配:
- 数组总长度 =
Width * Height * Depth - 三维坐标
(x, y, z)转扁平索引公式:index = x + y * Width + z * Width * Height - 扁平索引
index转三维坐标公式:x = index % Width y = (index // Width) % Height z = index // (Width * Height)
2. 生成六个相邻方向的坐标
三维空间中每个点有6个相邻点,对应三个轴的正负偏移:
- (x+1, y, z) → X轴正方向
- (x-1, y, z) → X轴负方向
- (x, y+1, z) → Y轴正方向
- (x, y-1, z) → Y轴负方向
- (x, y, z+1) → Z轴正方向
- (x, y, z-1) → Z轴负方向
3. 过滤无效坐标并转换回扁平索引
对每个相邻坐标,检查是否在有效范围内:
0 ≤ x < Width0 ≤ y < Height0 ≤ z < Depth
符合条件的坐标,用上述公式转回扁平索引,收集起来就是最终结果。
示例验证(Width=4, Height=4, Depth=4)
情况1:传入索引0
- 转换为三维坐标:
x=0%4=0,y=(0//4)%4=0,z=0//16=0→(0,0,0) - 相邻坐标有效性检查:
- (1,0,0) → 有效,对应索引
1 - (-1,0,0) → 无效
- (0,1,0) → 有效,对应索引
4 - (0,-1,0) → 无效
- (0,0,1) → 有效,对应索引
16 - (0,0,-1) → 无效
- (1,0,0) → 有效,对应索引
- 最终结果:
[1,4,16],和示例一致。
情况2:传入索引26
- 转换为三维坐标:
x=26%4=2,y=(26//4)%4=6%4=2,z=26//16=1→(2,2,1) - 相邻坐标转索引:
- (3,2,1) → 有效,对应索引
27 - (1,2,1) → 有效,对应索引
25 - (2,3,1) → 有效,对应索引
30 - (2,1,1) → 有效,对应索引
22 - (2,2,2) → 有效,对应索引
42 - (2,2,0) → 有效,对应索引
10
- (3,2,1) → 有效,对应索引
- 最终结果:
[27,25,30,22,42,10](元素和示例一致,顺序不影响)
实现代码示例(Python)
def get_neighbors(index, width, height, depth): # 转换为三维坐标 x = index % width y = (index // width) % height z = index // (width * height) neighbors = [] # 遍历六个方向偏移 directions = [(1,0,0), (-1,0,0), (0,1,0), (0,-1,0), (0,0,1), (0,0,-1)] for dx, dy, dz in directions: nx, ny, nz = x + dx, y + dy, z + dz # 检查坐标是否在有效范围内 if 0 <= nx < width and 0 <= ny < height and 0 <= nz < depth: # 转回扁平索引 neighbor_idx = nx + ny * width + nz * width * height neighbors.append(neighbor_idx) return neighbors # 测试示例 print(get_neighbors(0, 4, 4, 4)) # 输出 [1,4,16] print(get_neighbors(26, 4, 4, 4)) # 输出 [27,25,30,22,42,10]
注意事项
- 如果你的数组扁平化顺序不同(比如Z轴优先),只需调整坐标与索引的转换公式,核心逻辑保持不变。
- 函数需要提前获取数组的
Width、Height、Depth参数,这是计算的基础。
内容的提问来源于stack exchange,提问作者DevilsD
相关产品推荐
相关产品推荐

