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即可测试不同场景(如斜线、非整数坐标)。