2. 圆弧插补基础实现

任务目标

实现二维平面圆弧插补算法,支持顺/逆时针方向,输入起点、终点、圆心及方向,输出插补点序列,并验证所有插补点到圆心的距离与理论半径一致。

核心实现

import math

def arc_interpolate(start, end, center, clockwise=False, step_angle=0.1):
    """
    圆弧插补
    :param start: (x, y) 起点
    :param end: (x, y) 终点
    :param center: (cx, cy) 圆心
    :param clockwise: True=顺时针, False=逆时针
    :param step_angle: 插补步进角(弧度)
    :return: 插补点列表 [(x1,y1), (x2,y2), ...] 含起点不含终点
    """
    cx, cy = center
    sx, sy = start
    ex, ey = end

    # 计算半径
    r = math.hypot(sx - cx, sy - cy)

    # 起点和终点相对于圆心的角度
    theta_start = math.atan2(sy - cy, sx - cx)
    theta_end = math.atan2(ey - cy, ex - cx)

    # 计算总转角
    if clockwise:
        # 顺时针:角度递减
        delta = theta_start - theta_end
        if delta < 0:
            delta += 2 * math.pi
    else:
        # 逆时针:角度递增
        delta = theta_end - theta_start
        if delta < 0:
            delta += 2 * math.pi

    # 生成插补点
    points = []
    steps = max(1, int(math.ceil(delta / step_angle)))
    for i in range(steps):
        t = (i + 1) / steps
        angle = theta_start - delta * t if clockwise else theta_start + delta * t
        x = cx + r * math.cos(angle)
        y = cy + r * math.sin(angle)
        points.append((round(x, 6), round(y, 6)))

    return points

def verify_radius(points, center, r, tolerance=1e-4):
    """验证所有插补点到圆心距离与半径一致"""
    cx, cy = center
    for x, y in points:
        dist = math.hypot(x - cx, y - cy)
        if abs(dist - r) > tolerance:
            return False
    return True

if __name__ == "__main__":
    # 示例:圆心(0,0),起点(5,0),终点(0,5),逆时针90°
    center = (0, 0)
    start = (5, 0)
    end = (0, 5)
    r = 5.0

    pts = arc_interpolate(start, end, center, clockwise=False)
    print(f"逆时针插补点数: {len(pts)}")
    print(f"半径一致性验证: {'通过' if verify_radius(pts, center, r) else '失败'}")

    # 顺时针示例:从(0,5)回到(5,0)
    pts_cw = arc_interpolate(end, start, center, clockwise=True)
    print(f"顺时针插补点数: {len(pts_cw)}")
    print(f"顺时针半径验证: {'通过' if verify_radius(pts_cw, center, r) else '失败'}")

    # 打印前3个逆时针插补点
    for i, p in enumerate(pts[:3]):
        print(f"点{i+1}: {p}")

运行与验证

  1. 运行方式:将代码保存为 arc_interp.py,执行 python arc_interp.py。
  2. 预期输出:程序打印插补点数量、半径验证结果及前3个插补点坐标。逆时针从(5,0)到(0,5)应生成约16个点(步进角0.1,总转角π/2),所有点距圆心距离均为5.0。
  3. 判定标准:控制台输出“半径一致性验证: 通过”即表示算法正确。可修改起点/终点/圆心坐标测试不同圆弧,验证函数始终返回True。

关键说明

  • 算法通过atan2计算起终点相对圆心的极角,根据方向累加或递减角度生成插补点,保证路径为最短圆弧。
  • 步进角step_angle控制插补密度,值越小点数越多、轨迹越平滑。
  • 验证函数检查每个插补点到圆心距离与理论半径的偏差,容差默认1e-4,可自行调整。