You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为二维迷宫路径中的点添加90度增量旋转角度参数

为迷宫路径点添加旋转角度的实现方案

问题背景

现有一个4×4迷宫,已得到一条从起点到终点的可行路径:

[(3, 1), (3, 0), (2, 0), (3, 0), (3, 1), (3, 2), (2, 2), (2, 3), (1, 3), (1, 2), (0, 2), (1, 2), (1, 1), (1, 0), (0, 0), (0, 1)]

要求为每个路径点添加第三个值(旋转角度),规则如下:

  • 初始朝向为北
  • 旋转角度以90度为增量,-表示逆时针旋转
  • 每个点的角度代表从当前朝向转向下一个点移动方向所需的旋转量

核心逻辑

1. 方向与坐标映射

先明确迷宫坐标(行号x,列号y)对应的移动方向:

  • 北:行号减1(x-1, y,向上移动)
  • 东:列号加1(x, y+1,向右移动)
  • 南:行号加1(x+1, y,向下移动)
  • 西:列号减1(x, y-1,向左移动)

同时为每个方向分配角度值,方便计算旋转差:

  • 北:0°,东:90°,南:180°,西:270°

2. 旋转角度计算规则

对于连续两个路径点,计算从当前朝向到目标移动方向的旋转量:

  1. 根据当前点与下一个点的坐标差,确定目标移动方向
  2. 计算当前朝向角度与目标方向角度的差值(取模360°确保在0-359范围内)
  3. 转换为要求的旋转表示:
    • 差值0° → 无需旋转,记为0
    • 差值90° → 顺时针转90°,记为90
    • 差值180° → 转180°,记为180
    • 差值270° → 等价于逆时针转90°,记为-90

代码实现

# 方向与对应角度的映射
dir_angle = {
    'north': 0,
    'east': 90,
    'south': 180,
    'west': 270
}

# 根据坐标差判断移动方向
def get_target_dir(dx, dy):
    if dx == -1 and dy == 0:
        return 'north'
    elif dx == 0 and dy == 1:
        return 'east'
    elif dx == 1 and dy == 0:
        return 'south'
    elif dx == 0 and dy == -1:
        return 'west'
    raise ValueError("无效的移动坐标差")

# 处理路径,添加旋转角度
original_path = [(3, 1), (3, 0), (2, 0), (3, 0), (3, 1), (3, 2), (2, 2), (2, 3), (1, 3), (1, 2), (0, 2), (1, 2), (1, 1), (1, 0), (0, 0), (0, 1)]
path_with_rotation = []
current_facing = 'north'  # 初始朝向为北

for idx in range(len(original_path)):
    x1, y1 = original_path[idx]
    if idx == len(original_path) - 1:
        # 最后一个点无后续移动,旋转角度设为0
        path_with_rotation.append((x1, y1, 0))
        break
    x2, y2 = original_path[idx + 1]
    dx = x2 - x1
    dy = y2 - y1
    
    # 获取目标方向及对应角度
    target_dir = get_target_dir(dx, dy)
    current_angle = dir_angle[current_facing]
    target_angle = dir_angle[target_dir]
    
    # 计算旋转角度
    angle_diff = (target_angle - current_angle) % 360
    if angle_diff == 0:
        rotation = 0
    elif angle_diff == 90:
        rotation = 90
    elif angle_diff == 180:
        rotation = 180
    elif angle_diff == 270:
        rotation = -90
    else:
        rotation = 0  # 理论上不会触发
    
    path_with_rotation.append((x1, y1, rotation))
    # 更新当前朝向为目标方向
    current_facing = target_dir

# 输出结果
print(path_with_rotation)

结果验证

运行代码后,前两个点的结果为[(3, 1, -90), (3, 0, 90), ...],与示例一致:

  • 点(3,1)需从初始朝北逆时针转90°朝西,才能移动到(3,0)
  • 点(3,0)需从朝西顺时针转90°朝北,才能移动到(2,0)

另一段示例中的结果[..., (0, 2, 180), (1, 2, 90), (1, 1, 0), (1, 0, 90), ...]也符合逻辑:

  • 点(0,2)需从朝北转180°朝南,才能移动到(1,2)
  • 点(1,1)当前朝向已为朝西,无需旋转即可移动到(1,0)

内容的提问来源于stack exchange,提问作者aakhilv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 08:47:33