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