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 容差内判断等间距,避免浮点误差导致误判。
  • 本实现适用于任意二维直线插补场景,可直接嵌入运动控制流程中作为轨迹生成器。