4. 圆弧插补基础实现

任务目标

实现二维平面圆弧插补算法,支持顺时针(CW)与逆时针(CCW)方向,输入圆心、半径、起始角与终止角,输出插补点序列。

核心实现

import math

def arc_interpolate(cx, cy, radius, start_angle, end_angle, clockwise=False, step_angle=0.1):
    """
    圆弧插补:输出从起始角到终止角的插补点(含端点)
    参数:
        cx, cy      : 圆心坐标
        radius      : 圆弧半径
        start_angle : 起始角(弧度)
        end_angle   : 终止角(弧度)
        clockwise   : True=顺时针, False=逆时针
        step_angle  : 插补步长(弧度)
    返回:
        [(x1,y1), (x2,y2), ...] 插补点列表
    """
    # 确定角度增量方向
    if clockwise:
        # 顺时针:角度递减
        if end_angle > start_angle:
            end_angle -= 2 * math.pi
    else:
        # 逆时针:角度递增
        if end_angle < start_angle:
            end_angle += 2 * math.pi

    # 计算总角度差
    delta = end_angle - start_angle
    steps = max(1, int(abs(delta) / step_angle))

    points = []
    for i in range(steps + 1):
        angle = start_angle + delta * i / steps
        x = cx + radius * math.cos(angle)
        y = cy + radius * math.sin(angle)
        points.append((round(x, 6), round(y, 6)))

    return points

# 示例:逆时针90°圆弧(圆心原点,半径10,从0°到90°)
if __name__ == "__main__":
    pts_ccw = arc_interpolate(0, 0, 10, 0, math.pi/2, clockwise=False)
    print("逆时针圆弧点数:", len(pts_ccw))
    print("起点:", pts_ccw[0])
    print("终点:", pts_ccw[-1])

    # 示例:顺时针90°圆弧(从90°回到0°)
    pts_cw = arc_interpolate(0, 0, 10, math.pi/2, 0, clockwise=True)
    print("顺时针圆弧点数:", len(pts_cw))
    print("起点:", pts_cw[0])
    print("终点:", pts_cw[-1])

运行方式

python arc_interpolate.py

验证方法

  • 端点正确性:逆时针示例起点应为(10,0),终点应为(0,10);顺时针示例起点应为(0,10),终点应为(10,0)。
  • 半径一致性:所有输出点到圆心(0,0)的距离应等于10(允许浮点舍入误差)。
  • 方向正确性:逆时针插补点角度单调递增,顺时针单调递减。
  • 插补密度:点数 = ceil(|角度差|/步长) + 1,步长0.1弧度时90°圆弧约16个点。

预期输出

逆时针圆弧点数: 16
起点: (10.0, 0.0)
终点: (0.0, 10.0)
顺时针圆弧点数: 16
起点: (0.0, 10.0)
终点: (10.0, 0.0)
X Y O(0,0) 逆时针 顺时针 (10,0) (0,10)

上图示意圆心在原点、半径10的圆弧:红色实线为逆时针从(10,0)到(0,10),蓝色虚线为顺时针从(0,10)返回(10,0)。算法通过判断方向自动调整终止角,确保角度增量方向正确,避免跨零角度时出现反向插补。