已知两个端点的位置、切矢量和曲率,构造一条五阶Bézier 曲线实现 G² 连续的方法
给定起点 P₀ 和终点 P₅,以及:
- 起点处的单位切向量 T₀ 和曲率 κ₀
- 终点处的单位切向量 T₅ 和曲率 κ₅
要求:构造一条 5 次 Bézier 曲线 C(u)(u ∈ [0,1]),使其在两端分别满足 G² 几何连续条件(即位置、切线方向、曲率匹配)。
5 次 Bézier 曲线定义
C(u) = Σᵢ₌₀⁵ Bᵢ,₅(u) Pᵢ
其中 Bᵢ,₅(u) 是 5 次 Bernstein 基函数,P₀ … P₅ 为控制点。
我们已知 P₀ 和 P₅,需确定中间控制点 P₁, P₂, P₃, P₄。
步骤 1:利用 G² 条件建立约束
对任意 Bézier 曲线,其导数为:
C′(u) = 5 (P₁ − P₀) at u=0
C′(u) = 5 (P₅ − P₄) at u=1
C″(u) = 20 (P₂ − 2P₁ + P₀) at u=0
C″(u) = 20 (P₄ − 2P₅ + P₃) at u=1
设曲线在 u=0 处的速度大小为 v₀ = ‖C′(0)‖,在 u=1 处为 v₅ = ‖C′(1)‖。
由 G² 连续定义,需满足:
(1) 切线方向匹配(G¹):
C′(0) = v₀ T₀
C′(1) = v₅ T₅
即:
P₁ = P₀ + (v₀ / 5) T₀
P₄ = P₅ − (v₅ / 5) T₅
(2) 曲率匹配(G²):
平面或空间曲线的曲率公式为:
κ = ‖C′ × C″‖ / ‖C′‖³ (3D 叉积模)
或在 2D 中:κ = |C′ₓ C″ᵧ − C′ᵧ C″ₓ| / ‖C′‖³
但为避免叉积,可使用向量分解形式。将二阶导数分解为法向和切向分量:
C″ = κ ‖C′‖² N + (d‖C′‖/du) T
其中 N 是单位主法向量(垂直于 T)。
为简化,假设我们已知 曲率 κ 和对应的主法向量 N(若仅给 κ,需额外指定弯曲方向;通常在 2D 中 N 由 T 逆时针旋转 90° 得到)。
于是,在 u=0 处有:
C″(0) = κ₀ v₀² N₀ + a₀ T₀ (a₀ 为未知切向加速度)
同理在 u=1 处:
C″(1) = κ₅ v₅² N₅ + a₅ T₅
由于 Bézier 的 C″(0) = 20(P₂ − 2P₁ + P₀),代入 P₁ 表达式后可解出 P₂:
P₂ = P₀ + (2v₀ / 5) T₀ + (κ₀ v₀² / 20) N₀ + (a₀ / 20) T₀
合并切向项:
P₂ = P₀ + [(2v₀ + a₀/5) / 5] T₀ + (κ₀ v₀² / 20) N₀
类似地:
P₃ = P₅ − [(2v₅ + a₅/5) / 5] T₅ + (κ₅ v₅² / 20) N₅
步骤 2:自由度处理(确定 v₀, v₅, a₀, a₅)
5 次 Bézier 有 6 个控制点(12 个自由度,2D)。
已知:
- P₀, P₅(4 个约束)
- T₀, T₅(2 个方向,但已用于 P₁, P₄)
- κ₀, κ₅(2 个标量)
共需满足 8 个约束,剩余 4 个自由度。
常用策略:设切向加速度为零(a₀ = a₅ = 0),并选择 v₀ 和 v₅ 使曲线“自然”。
一种经典选择是令:
v₀ = v₅ = L
其中 L 为弦长:L = ‖P₅ − P₀‖
或使用更优启发式(如基于夹角调整):
v₀ = v₅ = (4/3) L sin(θ/2) / θ (θ 为 T₀ 与 T₅ 夹角,适用于圆弧拟合)
但最简单实用的方法是:
设定 a₀ = 0, a₅ = 0,并取 v₀ 和 v₅ 为待定参数,通过最小化某种能量(如弯曲能量)确定,或直接设 v₀ = v₅ = ‖P₅ − P₀‖
最终构造公式
假设:
- 已知单位切向量 T₀, T₅
- 已知曲率 κ₀, κ₅
- 在 2D 中,主法向量由切向量逆时针旋转 90° 得到:
N₀ = (−T₀.y, T₀.x),N₅ = (−T₅.y, T₅.x) - 设 a₀ = a₅ = 0
- 设 v₀ 和 v₅ 为正实数(可取 v₀ = v₅ = ‖P₅ − P₀‖ 或通过优化确定)
则控制点为:
P₀ = 给定
P₁ = P₀ + (v₀ / 5) T₀
P₂ = P₀ + (2v₀ / 5) T₀ + (κ₀ v₀² / 20) N₀
P₃ = P₅ − (2v₅ / 5) T₅ + (κ₅ v₅² / 20) N₅
P₄ = P₅ − (v₅ / 5) T₅
P₅ = 给定
总结
- 该 5 次 Bézier 曲线在两端精确满足 G² 连续条件(位置、切线方向、曲率)。
- 自由参数 v₀, v₅ 可调节曲线“张力”;若追求形状自然,可令 v₀ = v₅ = 弦长,或通过数值优化(如最小化 ∫κ² ds)确定。
- 若输入为 3D,需额外提供主法向量 N₀, N₅(不能仅靠 κ 推出)。
