1. 直线插补基础实现

任务目标

实现三维空间从起点到终点的直线插补,按给定步长输出各插补点坐标,并验证相邻插补点间距是否等距。

实现思路

直线插补的核心是沿起点指向终点的方向,按固定步长step逐步推进。首先计算总距离D,确定插补步数N = floor(D / step),然后从起点开始,每次沿单位方向向量前进step,生成N+1个点(含起点)。最后一步可能不足一个步长,因此实际终点与目标终点之间存在残余距离,本实现将其作为最后一段处理,保证插补点严格落在起点到终点的线段上。

代码实现

import numpy as np

def linear_interpolate(start, end, step):
    """
    直线插补:从start到end,按固定步长step生成插补点。
    返回:插补点列表(含起点,不含终点,终点由最后一段残余步长逼近)
    """
    start = np.array(start, dtype=float)
    end = np.array(end, dtype=float)
    vec = end - start
    D = np.linalg.norm(vec)
    if D == 0:
        return [start.copy()]  # 起点终点重合
    direction = vec / D
    N = int(D // step)  # 完整步数
    points = []
    for i in range(N + 1):  # 含起点,共N+1个点
        points.append(start + i * step * direction)
    # 若最后一点与终点距离大于阈值,则补充终点(残余段)
    if np.linalg.norm(points[-1] - end) > 1e-9:
        points.append(end)
    return points

# 示例:起点(0,0,0),终点(10,0,0),步长2
start = (0, 0, 0)
end = (10, 0, 0)
step = 2.0
pts = linear_interpolate(start, end, step)

# 输出插补点
print("插补点坐标:")
for i, p in enumerate(pts):
    print(f"P{i}: ({p[0]:.2f}, {p[1]:.2f}, {p[2]:.2f})")

# 验证等距分布
print("\n相邻点间距:")
dists = []
for i in range(len(pts) - 1):
    d = np.linalg.norm(pts[i+1] - pts[i])
    dists.append(d)
    print(f"d{i} = {d:.4f}")

# 判定:除最后一段外,其余间距应等于step
tol = 1e-6
full_steps = dists[:-1]  # 去掉最后残余段
if all(abs(d - step) < tol for d in full_steps):
    print("\n验证通过:所有完整步长均等于设定步长")
else:
    print("\n验证失败:存在偏离设定步长的插补段")

运行方式

  1. 安装依赖:pip install numpy
  2. 将上述代码保存为 linear_interp.py
  3. 运行:python linear_interp.py

验证方法与判定标准

运行后观察输出:

  • 插补点坐标应从(0,0,0)逐步递增至接近(10,0,0),最后一点为终点(10,0,0)。
  • 相邻点间距输出中,前4段(d0~d3)应精确等于2.0000,最后一段(d4)为残余距离,小于2.0。
  • 程序输出“验证通过:所有完整步长均等于设定步长”即表示等距性验证成功。

若修改起点、终点或步长参数,程序应自动适应并输出对应插补点,且完整步长始终等于设定步长。

预期输出(示例)

插补点坐标:
P0: (0.00, 0.00, 0.00)
P1: (2.00, 0.00, 0.00)
P2: (4.00, 0.00, 0.00)
P3: (6.00, 0.00, 0.00)
P4: (8.00, 0.00, 0.00)
P5: (10.00, 0.00, 0.00)

相邻点间距:
d0 = 2.0000
d1 = 2.0000
d2 = 2.0000
d3 = 2.0000
d4 = 2.0000

验证通过:所有完整步长均等于设定步长

注意:本例中10能被2整除,因此无残余段,所有间距均为2.0。若总距离不是步长整数倍,最后一段间距将小于步长,属正常现象。