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验证失败:存在偏离设定步长的插补段")
运行方式
- 安装依赖:
pip install numpy - 将上述代码保存为
linear_interp.py - 运行:
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。若总距离不是步长整数倍,最后一段间距将小于步长,属正常现象。