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