1. 直线插补基础实现

任务目标

实现二维平面内从起点到终点的直线插补器,按固定步长输出各插补点坐标,并验证相邻插补点间距与设定步长的一致性(等距精度)。

实现方案

采用参数化直线插补:将起点到终点的位移分解为X、Y分量,以步长对应的参数增量dt = step / total_length逐步推进。每次迭代累加参数t并计算当前坐标,直至到达终点。该方法保证插补点严格落在目标直线上,且相邻点间距恒等于设定步长(除最后一段可能因取整略短)。

完整代码

import math

def line_interpolate(start, end, step):
    """
    直线插补:从start到end,以固定步长step输出插补点
    参数:
        start: (x0, y0) 起点坐标
        end:   (x1, y1) 终点坐标
        step:  插补步长(相邻点间距)
    返回:
        points: [(x, y), ...] 包含起点和终点的所有插补点
    """
    x0, y0 = start
    x1, y1 = end
    dx = x1 - x0
    dy = y1 - y0
    total_len = math.hypot(dx, dy)

    if total_len == 0:
        return [start]

    # 插补总步数(向上取整保证覆盖终点)
    n = math.ceil(total_len / step)
    # 实际参数增量(保证最后一步精确到达终点)
    dt = 1.0 / n

    points = []
    for i in range(n + 1):
        t = i * dt
        x = x0 + dx * t
        y = y0 + dy * t
        points.append((round(x, 6), round(y, 6)))
    return points

def verify_equidistance(points, step, tolerance=1e-4):
    """
    验证相邻插补点间距是否等距(允许最后一段因取整略短)
    返回: (是否通过, 实际间距列表)
    """
    distances = []
    for i in range(len(points) - 1):
        d = math.hypot(points[i+1][0] - points[i][0],
                       points[i+1][1] - points[i][1])
        distances.append(d)

    # 除最后一段外,其余间距应与step一致(在容差范围内)
    passed = True
    for d in distances[:-1]:
        if abs(d - step) > tolerance:
            passed = False
            break
    return passed, distances

if __name__ == "__main__":
    # 示例:从(0,0)到(10,5),步长2
    start = (0.0, 0.0)
    end = (10.0, 5.0)
    step = 2.0

    pts = line_interpolate(start, end, step)
    print("插补点坐标:")
    for p in pts:
        print(f"  ({p[0]:.4f}, {p[1]:.4f})")

    ok, dists = verify_equidistance(pts, step)
    print(f"\n等距验证:{'通过' if ok else '失败'}")
    print(f"实际间距:{[f'{d:.4f}' for d in dists]}")

运行方式

python line_interp.py

验证方法与判定标准

  • 功能验证:程序输出从(0,0)到(10,5)的插补点序列,首点为起点、末点为终点,中间点均匀分布。
  • 等距精度验证:verify_equidistance计算相邻点间距,除最后一段外,所有间距与设定步长2.0的偏差小于1e-4即判定通过。
  • 预期输出(示例):插补点共6个(起点+4个中间点+终点),前5段间距均为2.0,最后一段间距约为0.180(因总长11.18不能被2整除,最后一段为余数)。

关键说明

  • 插补点坐标保留6位小数,避免浮点累积误差影响等距判断。
  • 步长大于总长时,直接输出起点和终点两个点,此时等距验证自动通过(无中间段)。
  • 本实现适用于二维直线插补,三维或多轴场景可扩展为向量形式。