1. 直线插补基础实现
任务目标
实现二维平面内从起点 P0(x0, y0) 到终点 P1(x1, y1) 的直线插补器。给定插补步数 N,输出各插补点坐标,并验证相邻插补点间距是否相等(等间距插补)。
核心实现
import math
def linear_interpolate(x0, y0, x1, y1, n):
"""
直线等间距插补
参数:
x0, y0: 起点坐标
x1, y1: 终点坐标
n: 插补段数(输出 n+1 个点,含起点和终点)
返回:
插补点列表 [(x, y), ...]
"""
if n <= 0:
raise ValueError("插补段数必须为正整数")
points = []
for i in range(n + 1):
t = i / n # 归一化参数,从 0 到 1
x = x0 + (x1 - x0) * t
y = y0 + (y1 - y0) * t
points.append((x, y))
return points
def verify_uniform_spacing(points):
"""
验证相邻点间距是否相等
返回: (是否等间距, 间距列表)
"""
if len(points) < 2:
return False, []
distances = []
for i in range(len(points) - 1):
dx = points[i+1][0] - points[i][0]
dy = points[i+1][1] - points[i][1]
dist = math.hypot(dx, dy)
distances.append(dist)
# 检查最大最小间距差是否在浮点容差内
tol = 1e-9
is_uniform = (max(distances) - min(distances)) < tol
return is_uniform, distances
# 最小调用示例
if __name__ == "__main__":
# 从 (0, 0) 到 (10, 5),插补 5 段
pts = linear_interpolate(0, 0, 10, 5, 5)
for idx, p in enumerate(pts):
print(f"点{idx}: ({p[0]:.6f}, {p[1]:.6f})")
ok, dists = verify_uniform_spacing(pts)
print(f"\n等间距验证: {'通过' if ok else '失败'}")
print(f"各段间距: {[f'{d:.6f}' for d in dists]}")
# 理论间距 = sqrt(10^2 + 5^2) / 5 = sqrt(125)/5 ≈ 2.236068
print(f"理论间距: {math.sqrt(125)/5:.6f}")
运行与验证
运行方式:将代码保存为 line_interp.py,执行 python line_interp.py。
预期输出:程序打印 6 个插补点坐标(起点到终点),随后显示等间距验证结果。由于代码逻辑确定,预期输出为:
点0: (0.000000, 0.000000)
点1: (2.000000, 1.000000)
点2: (4.000000, 2.000000)
点3: (6.000000, 3.000000)
点4: (8.000000, 4.000000)
点5: (10.000000, 5.000000)
等间距验证: 通过
各段间距: ['2.236068', '2.236068', '2.236068', '2.236068', '2.236068']
理论间距: 2.236068
判定标准:所有相邻点间距相等(等于理论间距 √(Δx²+Δy²)/N),且最后一个点精确等于终点坐标,即验证通过。
关键说明
- 插补采用参数方程
P(t) = P0 + (P1-P0)·t,t = i/N等间隔取值,从数学上保证等间距性质。 - 验证函数通过比较最大与最小间距差值是否在
1e-9容差内判断等间距,避免浮点误差导致误判。 - 本实现适用于任意二维直线插补场景,可直接嵌入运动控制流程中作为轨迹生成器。