1. 直线插补基础实现

任务目标

实现二维平面内从起点 P0(x0, y0) 到终点 P1(x1, y1) 的直线插补。给定插补步数 N,输出包含起点和终点在内的 N+1 个插补点坐标,并验证相邻插补点之间的欧氏距离是否相等(等距性验证)。

核心实现

import math

def linear_interpolate(x0, y0, x1, y1, n):
    """
    直线插补:从 P0 到 P1 均匀插补 n 段,返回 n+1 个点坐标列表。
    参数:
        x0, y0 : 起点坐标
        x1, y1 : 终点坐标
        n      : 插补段数(必须 ≥ 1)
    返回:
        [(x, y), ...] 共 n+1 个点,含起点和终点
    """
    if n < 1:
        raise ValueError("插补段数 n 必须 ≥ 1")
    
    points = []
    for i in range(n + 1):
        t = i / n  # 归一化参数,t ∈ [0, 1]
        x = x0 + (x1 - x0) * t
        y = y0 + (y1 - y0) * t
        points.append((x, y))
    return points

def verify_equidistance(points):
    """
    验证相邻点间距是否相等(等距性)。
    返回 (是否等距, 距离列表, 最大偏差)。
    """
    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)
    
    if not distances:
        return True, [], 0.0
    
    d0 = distances[0]
    max_dev = max(abs(d - d0) for d in distances)
    # 浮点容差判定
    is_equidistant = max_dev < 1e-9
    return is_equidistant, distances, max_dev

# ===== 最小调用示例 =====
if __name__ == "__main__":
    # 输入:起点(0,0),终点(10,0),插补4段
    pts = linear_interpolate(0, 0, 10, 0, 4)
    
    print("插补点坐标:")
    for idx, (px, py) in enumerate(pts):
        print(f"  P{idx}: ({px:.6f}, {py:.6f})")
    
    ok, dists, dev = verify_equidistance(pts)
    print(f"\n相邻间距:{[f'{d:.6f}' for d in dists]}")
    print(f"等距性验证:{'通过' if ok else '失败'},最大偏差 = {dev:.2e}")

运行与验证

运行方式:将上述代码保存为 linear_interp.py,在命令行执行:

python linear_interp.py

预期输出:(由代码逻辑直接推出)

插补点坐标:
  P0: (0.000000, 0.000000)
  P1: (2.500000, 0.000000)
  P2: (5.000000, 0.000000)
  P3: (7.500000, 0.000000)
  P4: (10.000000, 0.000000)

相邻间距:['2.500000', '2.500000', '2.500000', '2.500000']
等距性验证:通过,最大偏差 = 0.00e+00

判定标准:程序输出中“等距性验证”为“通过”,且所有相邻间距均为 2.5(即总长度 10 除以段数 4),即视为实现正确。

关键说明

  • 插补采用参数化直线方程 P(t) = P0 + t·(P1 - P0),t = i/N 均匀取值,保证几何上的等距性。
  • 验证函数使用浮点容差 1e-9 判断等距,避免浮点误差导致误判。
  • 该实现适用于任意二维直线插补,修改 x0,y0,x1,y1,N 即可测试不同场景(如斜线、非整数坐标)。