3D离散采样xy平面中层从节点254出发的螺旋遍历迭代规则求解
3D网格中间层螺旋遍历实现方案
前提参数说明
- Y轴方向节点数:
Y_SIZE = 13 - Z轴方向节点数:
Z_SIZE = 3 - 中间层中心节点全局索引:
CENTER_IDX = 254
核心实现思路
避开直接计算全局索引的复杂偏移,先将节点映射为以中心为原点的二维相对坐标(x_offset, y_offset),完成相对坐标的螺旋遍历后再统一转换为全局索引,逻辑通用可适配任意尺寸网格。
1. 相对坐标与全局索引转换公式
全局索引 = CENTER_IDX + x_offset * Z_SIZE + y_offset * Z_SIZE * Y_SIZE
可直接验证你给出的第一圈节点:
- 相对坐标
(0,-1):代入得254 + 0*3 + (-1)*3*13 = 215,对应第一圈第1个节点 - 相对坐标
(-1,-1):代入得254 + (-1)*3 + (-1)*3*13 = 212,对应第一圈第2个节点
所有第一圈节点完全匹配公式。
2. 螺旋遍历迭代规则
你要求第k圈节点间隔k-1个(即偏移量为k的整数倍),对应相对坐标生成规则为:
- 圈数k从1开始递增,直到触发边界条件停止
- 每圈固定生成8个符合
max(|x_offset|, |y_offset|) = k的坐标点,按顺时针(可按需调整为逆时针)顺序生成:(0, -k) → (-k, -k) → (-k, 0) → (-k, k) → (0, k) → (k, k) → (k, 0) → (k, -k) - 每生成一个坐标就代入转换公式得到全局索引,校验索引是否在网格合法范围内,合法则加入遍历结果,全圈无合法节点则终止遍历。
可直接复用的伪代码
# 基础参数配置 Y_SIZE = 13 Z_SIZE = 3 CENTER_IDX = 254 X_SIZE = 13 # 替换为你实际的X轴节点数 MAX_LEGAL_IDX = X_SIZE * Y_SIZE * Z_SIZE - 1 traversal_list = [CENTER_IDX] # 先加入中心起点 k = 1 while True: # 生成当前圈的8个相对坐标点 current_circle_points = [ (0, -k), (-k, -k), (-k, 0), (-k, k), (0, k), (k, k), (k, 0), (k, -k) ] valid_num = 0 for (x, y) in current_circle_points: current_idx = CENTER_IDX + x * Z_SIZE + y * Z_SIZE * Y_SIZE # 校验索引合法性 if 0 <= current_idx <= MAX_LEGAL_IDX: traversal_list.append(current_idx) valid_num += 1 # 无合法节点则终止遍历 if valid_num == 0: break k += 1
规则适配说明
- 若需要调整螺旋方向,只需修改
current_circle_points的坐标顺序即可 - 若需要调整圈间间隔,只需修改k的递增步长,比如步长为2就写
k += 2,完全可自定义 - 不需要手动计算每圈的偏移系数,逻辑统一可维护性高
内容的提问来源于stack exchange,提问作者rluq
相关产品推荐
相关产品推荐

