日期:2026年3月14日标签:Computer Graphics

B-Spline 中 Multiplicity(重数)的完整理解:它到底在控制什么? #

在学习 B-spline 时,一个很容易困惑的概念是:

multiplicity(重数)到底是什么?它为什么会影响曲线的“光滑程度”?

如果只记结论(比如 CpkC^{p-k}),往往会很抽象。

这篇文章尝试从“结构 + 直觉 + 数学作用”三个层面把它彻底讲清楚。


1. Multiplicity 是什么? #

在 B-spline 中:

  • knot vector 是参数序列
  • multiplicity 是“某个 knot 出现的次数”

数学定义 #

如果某个 knot 是:

uiu_i

它在 knot vector 中出现 kk 次,则:

k=multiplicity of uik = \text{multiplicity of } u_i

举例 #

情况 1:没有重复 #

U=0, 0.3, 0.6, 1U = {0,\ 0.3,\ 0.6,\ 1}

所有 multiplicity 都是:

k=1k = 1

情况 2:有重复 #

U=0, 0, 0, 0.3, 0.6, 1U = {0,\ 0,\ 0,\ 0.3,\ 0.6,\ 1}

则:

  • 00 的 multiplicity = 3
  • 其他为 1

2. Multiplicity 的直觉意义(非常重要) #

可以用一句话理解:

multiplicity = 这个 knot “被卡住的程度”


更直观理解 #

B-spline 曲线像一条“弹性软管”,knot 是“钉子”。

概念类比
knot钉子位置
multiplicity钉子钉了几颗
degree软管柔软程度

👉 钉子越多:

  • 软管越不容易平滑通过
  • 曲线越容易产生“折角”

3. Multiplicity 真正控制的是什么? #

核心结论:

multiplicity 控制的是:连续性(smoothness)


4. 核心公式(必须理解) #

B-spline 在 knot 处的连续性为:

CpkC^{p-k}

其中:

  • pp = degree(次数)
  • kk = multiplicity(重数)

5. 这个公式是什么意思? #

我们用三次 B-spline(p=3p=3)举例:


情况 1:k = 1(普通情况) #

C31=C2C^{3-1} = C^2

👉 非常光滑:

  • 位置连续
  • 一阶导连续
  • 二阶导连续

情况 2:k = 2 #

C32=C1C^{3-2} = C^1

👉 开始“有折感”:

  • 位置连续
  • 一阶连续
  • 二阶不连续

情况 3:k = 3 #

C33=C0C^{3-3} = C^0

👉 只保证不断开:

  • 有明显拐角

情况 4:k = 4 #

C34C^{3-4}

👉 不连续(断开)


6. 为什么“重复”会降低光滑性? #

这是 multiplicity 最核心的问题。


B-spline 本质 #

B-spline 曲线是:

C(u)=Ni,p(u)PiC(u)=\sum N_{i,p}(u)P_i

它的光滑性来自:

相邻片段之间“共享导数信息”


multiplicity 做了什么? #

👉 它减少了“共享信息的数量”


可以理解为: #

  • knot 是拼接点
  • multiplicity 是“切断共享约束的次数”

结果: #

共享越少 → 拼接越不平滑


7. 一个更本质的理解(关键) #

✔️ B-spline 拼接需要满足: #

  • 位置连续
  • 一阶导连续
  • 二阶导连续

✔️ 这些条件来自“自由度匹配” #

p 次多项式:

p+1 个自由度p+1 \text{ 个自由度}

✔️ multiplicity 的作用: #

每增加一次 multiplicity,就减少一个可匹配的导数条件


8. Multiplicity vs Continuity 的关系 #

我们可以总结成表:

multiplicity k连续性
1Cp1C^{p-1}(最光滑)
2Cp2C^{p-2}
pC0C^0(只有位置连续)
p+1不连续

9. clamped B-spline 的本质(非常重要) #

你之前学过:

clamped = 首尾节点重复 p+1p+1


也就是: #

k=p+1k = p+1

代入公式: #

Cp(p+1)=C1C^{p-(p+1)} = C^{-1}

👉 不要求连续性


但为什么还能经过端点? #

因为:

端点是“边界条件”,不是拼接点


10. OCCT 中 Multiplicities() #

在 OCCT 里:

curve->Multiplicities();

返回:

k0,k1,,km{k_0, k_1, \dots, k_m}

和 Knot 一一对应: #

KnotMultiplicity
uiu_ikik_i

11. Multiplicity 的工程意义(OCCT 视角) #

它控制三件事:


① 曲线是否光滑 #


② 是否出现折点(sharp corner) #


③ 是否断开 #


12. 一个完整例子 #

三次 B-spline:

p=3p=3

knot vector: #

U=0,0,0,0, 0.5, 1,1,1,1U = {0,0,0,0,\ 0.5,\ 1,1,1,1}

multiplicities: #

knotk
04
0.51
14

结果: #

  • 起点:clamped(强约束)
  • 中间:平滑
  • 端点:clamped

13. 最核心统一理解(非常重要) #

可以这样记:


✔️ 三个核心量: #

概念含义
Knot参数位置
Multiplicity“连续性破坏程度”
Degree曲线柔软程度

✔️ 核心关系: #

CpkC^{p-k}

14. 一句话总结(最重要) #

Multiplicity 控制 B-spline 在某个 knot 处“破坏了多少连续性”,从而决定曲线是平滑过渡、折角还是断开。


15. 最终直觉模型 #

可以记成:

knot = 拼接点
multiplicity = 钉子数量(约束强度)
degree = 曲线柔软程度

16. 最终一句话总结 #

multiplicity 越大 → 共享导数越少 → 曲线越不光滑\boxed{ \text{multiplicity 越大 → 共享导数越少 → 曲线越不光滑} }
目录