三次B样条曲线在参数u(u 不是原始节点向量中的节点)处打断成两条B样条曲线的方法
当一条三次B样条曲线在参数 u 处打断(u 不是原始节点向量中的节点),需要将其分割为两条新的B样条曲线时,可以使用 节点插入算法(Knot Insertion) 来实现。该方法基于 B样条的局部性质和节点插入理论,确保分割后的两条曲线在几何上与原曲线完全一致。
1. 基本定义
- 曲线次数:p = 3(三次)
- 控制点:P₀, P₁, ..., Pₙ
- 节点向量:U = [u₀, u₁, ..., uₘ],其中 m = n + p + 1 = n + 4
- 待插入参数:u ∈ (uₖ, uₖ₊₁),且 u ∉ U(即 u 不是原节点)
目标:
- 将原曲线在参数 u 处打断
- 得到两条新B样条曲线:
- 第一条:对应参数区间 [u₀, u]
- 第二条:对应参数区间 [u, uₘ]
2. 步骤一:确定节点区间
找到整数 k,使得: uₖ ≤ u < uₖ₊₁
这个 k 表示 u 所在的非均匀区间编号。
3. 步骤二:节点插入算法(Boehm 算法)
由于 u 不在原节点向量中,需插入一次(重数 r = 1),生成新的控制点和节点向量。
新节点向量 U':
U' = [u₀, u₁, ..., uₖ, u, uₖ₊₁, ..., uₘ]
总长度增加 1。
新控制点 Qᵢ 计算:
设新控制点为 Q₀, Q₁, ..., Qₙ₊₁
计算公式如下:
对于 i = 0 到 n:
- 若 i ≤ k−3,则 Qᵢ = Pᵢ
- 若 i ≥ k+1,则 Qᵢ = Pᵢ₋₁
- 若 i = k−2, k−1, k,则按以下公式计算:
αᵢ = (u − uᵢ) / (uᵢ₊₃ − uᵢ)
Qᵢ = αᵢ · Pᵢ + (1 − αᵢ) · Pᵢ₋₁
例如:
- Qₖ₋₂ = αₖ₋₂·Pₖ₋₂ + (1−αₖ₋₂)·Pₖ₋₃
- Qₖ₋₁ = αₖ₋₁·Pₖ₋₁ + (1−αₖ₋₁)·Pₖ₋₂
- Qₖ = αₖ·Pₖ + (1−αₖ)·Pₖ₋₁
其余点平移:
- Q₀ 到 Qₖ₋₃ 不变(若存在)
- Qₖ₊₁ 到 Qₙ₊₁ 对应 Pₖ 到 Pₙ
4. 步骤三:分割为两条B样条曲线
插入节点 u 后,曲线在 u 处成为一个“角点”(但仍是 C² 连续,因仅插入一次),可安全分割。
第一段曲线(从起点到 u)
- 控制点:Q₀, Q₁, ..., Qₖ
- 控制点数量:k + 1
- 节点向量:U₁ = [u₀, u₁, ..., uₖ, u, u, u, u]
(重复 u 共 p+1 = 4 次,以闭合区间) - 参数范围:[u₀, u]
第二段曲线(从 u 到终点)
- 控制点:Qₖ, Qₖ₊₁, ..., Qₙ₊₁
- 控制点数量:n + 2 − k
- 节点向量:U₂ = [u, u, u, u, uₖ₊₁, ..., uₘ]
(开头重复 u 四次) - 参数范围:[u, uₘ]
5. 可选:提升 u 的重数至 p(用于分段端点插值)
若希望新曲线在 u 处精确经过断点 Qₖ(即端点插值),需将 u 的重数提升至 p = 3(或 p+1 = 4)。
可通过重复插入 u 节点最多 3 次(因原重数为 0)。
每次插入后更新控制点,最终 u 成为多重节点,Qₖ 即为曲线在 u 处的实际位置。
6. 总结流程(可直接操作)
- 找到 k 使得 uₖ ≤ u < uₖ₊₁
- 计算 αᵢ = (u − uᵢ)/(uᵢ₊₃ − uᵢ),i = k−2, k−1, k
- 插入节点 u,生成新控制点 Q₀ 到 Qₙ₊₁
- 分割控制点:
- 第一段:Q₀ ... Qₖ
- 第二段:Qₖ ... Qₙ₊₁
- 构造新节点向量(两端补全 u 的重复)
- 得到两条独立的三次B样条曲线