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}")
运行与验证
- 运行方式:将代码保存为
arc_interp.py,执行python arc_interp.py。 - 预期输出:程序打印插补点数量、半径验证结果及前3个插补点坐标。逆时针从(5,0)到(0,5)应生成约16个点(步进角0.1,总转角π/2),所有点距圆心距离均为5.0。
- 判定标准:控制台输出“半径一致性验证: 通过”即表示算法正确。可修改起点/终点/圆心坐标测试不同圆弧,验证函数始终返回True。
关键说明
- 算法通过atan2计算起终点相对圆心的极角,根据方向累加或递减角度生成插补点,保证路径为最短圆弧。
- 步进角
step_angle控制插补密度,值越小点数越多、轨迹越平滑。 - 验证函数检查每个插补点到圆心距离与理论半径的偏差,容差默认1e-4,可自行调整。