计算点到三次 Bézier 曲线最短距离及对应参数 u 的方法(转化为五次多项式)
1. 三次 Bézier 曲线定义
给定控制点 P₀、P₁、P₂、P₃,曲线为:
C(u) = (1−u)³ P₀ + 3(1−u)²u P₁ + 3(1−u)u² P₂ + u³ P₃, u ∈ [0, 1]
2. 最短距离条件
设空间点为 P。最短距离对应的参数 u 满足:
向量 C(u) − P 与切向量 C′(u) 正交,即:
(C(u) − P) ⋅ C′(u) = 0
该方程是关于 u 的 五次多项式方程。
3. 构造五次多项式系数
为简化计算,引入以下辅助向量(均为常向量):
A = P₀ − P
B = P₁ − P₀
C = P₂ − 2P₁ + P₀
D = P₃ − 3P₂ + 3P₁ − P₀
则:
C(u) − P = A + 3B u + 3C u² + D u³
C′(u) = 3B + 6C u + 3D u²
代入正交条件并除以 3,得:
(A + 3B u + 3C u² + D u³) ⋅ (B + 2C u + D u²) = 0
展开后得到五次多项式:
k₅ u⁵ + k₄ u⁴ + k₃ u³ + k₂ u² + k₁ u + k₀ = 0
其中系数为:
k₀ = A ⋅ B
k₁ = 2 A ⋅ C + 3 B ⋅ B
k₂ = A ⋅ D + 6 B ⋅ C + 3 C ⋅ C
k₃ = 3 B ⋅ D + 6 C ⋅ C + 3 C ⋅ D
k₄ = 3 C ⋅ D + 3 D ⋅ D
k₅ = D ⋅ D
注:所有 “⋅” 表示向量点积(数量积)。
4. 求解步骤
- 计算系数 k₀ 到 k₅(标量)。
- 求解五次方程:k₅ u⁵ + k₄ u⁴ + k₃ u³ + k₂ u² + k₁ u + k₀ = 0
→ 使用数值方法(如 Jenkins-Traub、Durand-Kerner 或 Eigen/Boost 等库)求出所有实根。 - 保留区间 [0, 1] 内的实根,记为候选参数 {uᵢ}。
- 添加端点 u = 0 和 u = 1 到候选集。
- 对每个候选 u,计算距离 ‖C(u) − P‖。
- 取距离最小者对应的 u* 和最短距离 dₘᵢₙ = ‖C(u*) − P‖。
5. 说明
- 五次方程无解析求根公式,必须用数值方法。
- 实际应用中,可结合牛顿迭代法以提高精度。
- 若 D = 0(退化为二次或直线),多项式次数降低,仍适用上述公式(高阶系数为 0)。
