计算点到三次 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. 求解步骤
  1. 计算系数 k₀ 到 k₅(标量)。
  2. 求解五次方程:k₅ u⁵ + k₄ u⁴ + k₃ u³ + k₂ u² + k₁ u + k₀ = 0
    → 使用数值方法(如 Jenkins-Traub、Durand-Kerner 或 Eigen/Boost 等库)求出所有实根。
  3. 保留区间 [0, 1] 内的实根,记为候选参数 {uᵢ}。
  4. 添加端点 u = 0 和 u = 1 到候选集。
  5. 对每个候选 u,计算距离 ‖C(u) − P‖。
  6. 取距离最小者对应的 u* 和最短距离 dₘᵢₙ = ‖C(u*) − P‖。
5. 说明
  • 五次方程无解析求根公式,必须用数值方法。
  • 实际应用中,可结合牛顿迭代法以提高精度。
  • 若 D = 0(退化为二次或直线),多项式次数降低,仍适用上述公式(高阶系数为 0)。
相关推荐
haing20192 个月前
已知两个平面点的坐标、切线方向、曲率,构造三阶Bezier曲线的方法
平面·曲率·bezier曲线·g2连续
freexyn3 个月前
Matlab算法编程示例4:数值解法求解常微分方程的代码实例
人工智能·算法·matlab·微分方程·数值解法·算法代码
Jurio.2 年前
多项式和Bezier曲线拟合
python·bezier曲线