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

B-Spline 曲线的重要性质:为什么它比 Bézier 更适合复杂曲线设计? #

在学习 B-Spline 曲线时,单独记住定义是不够的。真正体现 B-Spline 价值的是它的一系列性质:分段表示、局部控制、强凸包性质、节点连续性、仿射不变性等。

这些性质解释了为什么 B-Spline 在计算机图形学、CAD、曲线曲面建模中非常重要。

本文主要整理 B-Spline 曲线的几个重要性质,并解释它们的直观意义。


1. 回顾:B-Spline 曲线的定义 #

一条 pp 次 B-Spline 曲线可以写成:

C(u)=i=0nNi,p(u)PiC(u)=\sum_{i=0}^{n}N_{i,p}(u)P_i

其中:

  • P0,P1,,PnP_0,P_1,\ldots,P_n 是控制点;
  • Ni,p(u)N_{i,p}(u) 是第 iipp 次 B-Spline 基函数;
  • uu 是参数;
  • C(u)C(u) 是曲线上的点;
  • pp 是曲线次数;
  • U=u0,u1,,umU={u_0,u_1,\ldots,u_m} 是节点向量。

这个公式可以理解为:

曲线点=基函数权重×控制点\text{曲线点}=\sum \text{基函数权重}\times \text{控制点}

也就是说,曲线上的点是控制点的加权平均。

B-Spline 的关键在于:这些权重 Ni,p(u)N_{i,p}(u) 不是固定的,而是由节点向量 UU 和曲线次数 pp 共同决定。

因此,可以记住这个关系:

节点向量基函数权重曲线形状\text{节点向量} \rightarrow \text{基函数权重} \rightarrow \text{曲线形状}

2. 性质一:B-Spline 是分段曲线 #

B-Spline 曲线 C(u)C(u) 是一条分段曲线,每一小段都是 pp 次曲线。

这句话的意思是:

B-Spline 不是用一个整体高次多项式描述整条曲线,而是把参数区间按照节点分成多个小区间,每个小区间对应曲线上的一小段。

这些小区间叫做 knot span,也就是节点区间。

例如,节点向量中有相邻两个节点:

[ui,ui+1)[u_i,u_{i+1})

那么这个区间就是一个 knot span。

曲线可以看成:

整条 B-Spline 曲线=====================第 1 段曲线+第 2 段曲线+\text{整条 B-Spline 曲线} ===================== \text{第 1 段曲线} + \text{第 2 段曲线} +\cdots

如果 p=3p=3,那么每一段都是三次曲线。

这个性质非常重要,因为它说明:

B-Spline 可以用低次数曲线段组合出复杂形状。

这和 Bézier 曲线形成对比。

对于 Bézier 曲线,如果控制点数量很多,曲线次数也会变高。例如 11 个控制点对应 10 次 Bézier 曲线。高次 Bézier 曲线往往不容易控制,也不一定能很好地贴近控制多边形。

而 B-Spline 可以有很多控制点,但每一段仍然保持低次数。例如可以用三次 B-Spline 表示复杂形状。

这就是 B-Spline 的一个核心优势:

控制点数量可以很多,但曲线次数仍然可以较低。


3. 性质二:次数越低,曲线通常越贴近控制多边形 #

控制多边形是把控制点按顺序连接起来形成的折线:

P0P1PnP_0 \rightarrow P_1 \rightarrow \cdots \rightarrow P_n

一般来说,在其他条件相近时,B-Spline 的次数越低,曲线越贴近控制多边形。

可以写成直观关系:

p曲线更贴近控制多边形p \downarrow \quad \Rightarrow \quad \text{曲线更贴近控制多边形}

为什么会这样?

可以从影响范围理解:

  • 次数越高,每个控制点影响的范围越大,曲线更“平均化”;
  • 次数越低,控制点对附近曲线段的影响更直接,曲线更容易跟随控制多边形。

因此,三次 B-Spline 很常用。

它既不像一次或二次曲线那样可能不够平滑,又不像高次曲线那样难以控制。三次 B-Spline 在“平滑性”和“可控性”之间取得了很好的平衡。


4. 性质三:控制点数量、节点数量和次数必须满足固定关系 #

B-Spline 中,控制点数量、节点数量和曲线次数不能随便给。

它们必须满足:

m=n+p+1m=n+p+1

其中:

  • 控制点数量是 n+1n+1
  • 节点数量是 m+1m+1
  • 曲线次数是 pp

因此也可以写成:

节点数量=控制点数量+p+1\text{节点数量}=\text{控制点数量}+p+1

因为:

m+1=(n+1)+p+1m+1=(n+1)+p+1

举例:

如果有 10 个控制点,那么:

n+1=10n+1=10

所以:

n=9n=9

如果曲线次数是 3:

p=3p=3

那么:

m=n+p+1=9+3+1=13m=n+p+1=9+3+1=13

节点数量是:

m+1=14m+1=14

所以,10 个控制点的三次 B-Spline 需要 14 个节点。

这个性质说明:

B-Spline 比 Bézier 更灵活,但不是完全任意。控制点数量、节点数量、次数三者必须匹配。


5. 性质四:Clamped B-Spline 会经过首尾控制点 #

Clamped B-Spline 的一个重要性质是:

曲线会经过第一个控制点 P0P_0 和最后一个控制点 PnP_n

也就是:

C(ustart)=P0C(u_{\text{start}})=P_0 C(uend)=PnC(u_{\text{end}})=P_n

如果参数区间归一化到 [0,1][0,1],就可以写成:

C(0)=P0C(0)=P_0 C(1)=PnC(1)=P_n

5.1 什么是 clamped? #

对于 pp 次 B-Spline,如果节点向量首尾各重复 p+1p+1 次,就叫 clamped。

首部节点满足:

u0=u1==upu_0=u_1=\cdots=u_p

尾部节点满足:

ump=ump+1==umu_{m-p}=u_{m-p+1}=\cdots=u_m

例如三次 B-Spline 中:

p=3p=3

所以首尾各重复:

p+1=4p+1=4

个节点。

一个归一化的三次 clamped knot vector 可以写成:

U={0,0,0,0,13,23,1,1,1,1}U=\left\{0,0,0,0,\frac{1}{3},\frac{2}{3},1,1,1,1\right\}

这里开头四个节点都是 0,结尾四个节点都是 1。


5.2 为什么 clamped 会让曲线经过首尾控制点? #

B-Spline 曲线是控制点的加权和:

C(u)=N0,p(u)P0+N1,p(u)P1++Nn,p(u)PnC(u)=N_{0,p}(u)P_0+N_{1,p}(u)P_1+\cdots+N_{n,p}(u)P_n

如果在起点处,基函数权重变成:

N0,p(ustart)=1N_{0,p}(u_{\text{start}})=1

并且其他基函数权重都是 0:

N1,p(ustart)=N2,p(ustart)==Nn,p(ustart)=0N_{1,p}(u_{\text{start}})=N_{2,p}(u_{\text{start}})=\cdots=N_{n,p}(u_{\text{start}})=0

那么曲线起点就是:

C(ustart)=1P0+0P1++0PnC(u_{\text{start}})=1\cdot P_0+0\cdot P_1+\cdots+0\cdot P_n

所以:

C(ustart)=P0C(u_{\text{start}})=P_0

clamped 节点向量的作用,就是通过首部节点重复 p+1p+1 次,让起点处第一个基函数的权重变成 1,其他基函数权重变成 0。

终点同理。

在终点处:

Nn,p(uend)=1N_{n,p}(u_{\text{end}})=1

其他基函数为 0,所以:

C(uend)=PnC(u_{\text{end}})=P_n

因此可以总结为:

clamped = 首尾节点各重复 p+1p+1 次 = 曲线经过首尾控制点。


6. 性质五:强凸包性质 #

B-Spline 具有强凸包性质。

普通凸包性质是说:

曲线位于所有控制点形成的凸包内。

而 B-Spline 的强凸包性质更精细。

如果参数 uu 位于 knot span:

[ui,ui+1)[u_i,u_{i+1})

那么曲线点 C(u)C(u) 位于下面这些局部控制点形成的凸包内:

Pip,Pip+1,,PiP_{i-p},P_{i-p+1},\ldots,P_i

也就是说,某一小段曲线不是被所有控制点共同控制,而是只被附近的 p+1p+1 个控制点控制。

例如三次 B-Spline 中:

p=3p=3

所以某个 knot span 上最多只有:

p+1=4p+1=4

个控制点真正影响这一段曲线。


6.1 为什么叫“强”凸包性质? #

因为它不仅说整条曲线在所有控制点的大凸包里,还说:

每一小段曲线都在局部几个控制点的小凸包里。

这比普通凸包性质更强。

强凸包性质带来的好处是:

  • 曲线形状更容易预测;
  • 局部曲线不会远离对应的局部控制点;
  • 设计者可以根据局部控制多边形判断曲线大致走向。

6.2 为什么强凸包性质成立? #

在某个 knot span 上,只有 p+1p+1 个基函数非零。

同时,B-Spline 基函数满足:

Ni,p(u)0N_{i,p}(u)\geq 0

并且:

iNi,p(u)=1\sum_i N_{i,p}(u)=1

所以曲线点:

C(u)=iNi,p(u)PiC(u)=\sum_i N_{i,p}(u)P_i

本质上是局部控制点的加权平均。

只要权重非负,并且权重和为 1,加权平均点就一定落在这些控制点形成的凸包里。

这就是强凸包性质的原因。


7. 性质六:局部修改性质 #

B-Spline 的一个核心优势是局部修改。

文章中的性质是:

改变控制点 PiP_i 的位置,只会影响曲线在区间 [ui,ui+p+1)[u_i,u_{i+p+1}) 上的部分。

也就是:

Pi 只影响 C(u) 在 [ui,ui+p+1) 上的部分P_i \text{ 只影响 } C(u) \text{ 在 } [u_i,u_{i+p+1}) \text{ 上的部分}

为什么?

因为控制点 PiP_i 对曲线的影响来自基函数 Ni,p(u)N_{i,p}(u)

而 B-Spline 基函数有局部支撑性质:

Ni,p(u)N_{i,p}(u)

只在区间:

[ui,ui+p+1)[u_i,u_{i+p+1})

内可能非零。

在这个区间之外:

Ni,p(u)=0N_{i,p}(u)=0

所以在区间之外,控制点 PiP_i 对曲线没有影响。

这就是 B-Spline 的局部控制性。


7.1 和 Bézier 曲线的区别 #

Bézier 曲线中,一个控制点通常会影响整条曲线。

而 B-Spline 中,移动一个控制点只影响有限范围内的曲线段。

这对曲线设计非常重要。

例如你已经设计好一条复杂曲线,只想微调其中一小段。使用 Bézier 曲线时,可能会牵一发动全身;使用 B-Spline 时,只需要移动附近控制点,其他部分可以保持不变。

所以 B-Spline 更适合复杂形状的局部编辑。


8. 性质七:节点重复度决定曲线连续性 #

B-Spline 的连续性和节点重复度有关。

文章中的性质是:

如果某个 knot 的重复度是 kk,那么曲线在这个 knot 处具有 CpkC^{p-k} 连续性。

公式是:

continuity=Cpk\text{continuity}=C^{p-k}

其中:

  • pp 是曲线次数;
  • kk 是节点重复度;
  • CpkC^{p-k} 表示参数连续阶数。

8.1 普通内部节点 #

如果一个内部节点不重复,那么它的重复度是:

k=1k=1

所以连续性是:

Cp1C^{p-1}

例如三次 B-Spline:

p=3p=3

普通内部节点处的连续性是:

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

这意味着普通三次 B-Spline 在内部节点处通常具有二阶连续性:

  • 位置连续;
  • 一阶导数连续;
  • 二阶导数连续。

因此三次 B-Spline 看起来非常平滑。


8.2 重复节点会降低连续性 #

根据公式:

CpkC^{p-k}

当节点重复度 kk 增大时,连续性阶数会下降。

以四次 B-Spline 为例:

p=4p=4

如果是简单节点:

k=1k=1

连续性是:

C41=C3C^{4-1}=C^3

如果是双重节点:

k=2k=2

连续性是:

C42=C2C^{4-2}=C^2

如果是三重节点:

k=3k=3

连续性是:

C43=C1C^{4-3}=C^1

如果是四重节点:

k=4k=4

连续性是:

C44=C0C^{4-4}=C^0

所以:

节点重复度越高,曲线在该位置越不光滑。

这也说明节点不仅决定参数分段,还可以用来控制局部平滑程度。


9. 性质八:变差减小性质 #

B-Spline 还具有变差减小性质。

英文是:

Variation Diminishing Property

它的意思是:

如果曲线在平面中,那么任意一条直线与 B-Spline 曲线的交点数量,不会超过这条直线与控制多边形的交点数量。

可以写成:

直线与曲线的交点数直线与控制多边形的交点数\text{直线与曲线的交点数} \leq \text{直线与控制多边形的交点数}

如果曲线在三维空间中,则把“直线”换成“平面”。

这个性质的直观含义是:

B-Spline 曲线不会比控制多边形振荡得更厉害。

如果控制多边形本身比较平稳,曲线不会凭空产生很多额外波动。

这也是 B-Spline 曲线形状稳定的原因之一。


10. 性质九:Bézier 曲线是 B-Spline 的特例 #

Bézier 曲线可以看成是 B-Spline 的特殊情况。

当满足:

n=pn=p

也就是:

B-Spline 的次数=控制点数量1\text{B-Spline 的次数}=\text{控制点数量}-1

并且节点向量首尾各有 p+1p+1 个重复节点时,这条 B-Spline 就退化成 Bézier 曲线。

换句话说:

B-Spline 是 Bézier 的推广,Bézier 是 B-Spline 的特例。

这也解释了为什么它们的公式形式很像。

Bézier 曲线可以写成:

C(t)=i=0nBi,n(t)PiC(t)=\sum_{i=0}^{n}B_{i,n}(t)P_i

B-Spline 曲线可以写成:

C(u)=i=0nNi,p(u)PiC(u)=\sum_{i=0}^{n}N_{i,p}(u)P_i

它们都是:

曲线点=基函数权重×控制点\text{曲线点}=\sum \text{基函数权重}\times \text{控制点}

区别在于:

  • Bézier 使用 Bernstein 基函数;
  • B-Spline 使用 B-Spline 基函数;
  • Bézier 的次数由控制点数量决定;
  • B-Spline 的次数可以和控制点数量分离。

11. 性质十:仿射不变性 #

B-Spline 具有仿射不变性。

仿射变换包括:

  • 平移;
  • 旋转;
  • 缩放;
  • 斜切;
  • 线性变换。

仿射不变性的意思是:

对 B-Spline 曲线做仿射变换,等价于对它的控制点做同样的仿射变换。

也就是说,如果有一个仿射变换 TT,那么:

T(C(u))=i=0nNi,p(u)T(Pi)T(C(u))=\sum_{i=0}^{n}N_{i,p}(u)T(P_i)

这个性质在工程中非常方便。

如果你想旋转、缩放或平移一条 B-Spline 曲线,不需要对曲线上的所有采样点做变换,只需要对控制点做变换,然后重新生成曲线即可。


12. B-Spline 的优势总结 #

B-Spline 比 Bézier 需要更多信息:

  • 需要指定曲线次数 pp
  • 需要指定节点向量 UU
  • 需要理解 B-Spline 基函数。

所以它的理论比 Bézier 更复杂。

但是 B-Spline 的优势也非常明显。

12.1 低次数表达复杂形状 #

B-Spline 是分段曲线,因此可以使用多个低次数曲线段组成复杂曲线。

这避免了单条高次 Bézier 曲线难以控制的问题。


12.2 控制点数量和曲线次数分离 #

Bézier 曲线中:

次数=控制点数量1\text{次数}=\text{控制点数量}-1

而 B-Spline 中,控制点数量和次数可以分离。

你可以有很多控制点,但仍然使用三次 B-Spline。


12.3 具有局部控制性 #

移动一个控制点 PiP_i 只影响:

[ui,ui+p+1)[u_i,u_{i+p+1})

这个参数区间内的曲线。

这使得 B-Spline 非常适合局部编辑。


12.4 强凸包性质让形状更可预测 #

每一段曲线都位于局部 p+1p+1 个控制点形成的凸包中。

这让设计者可以更直观地判断曲线形状。


12.5 节点重复度可以控制连续性 #

通过修改节点重复度,可以控制曲线在某些位置的平滑程度。

节点重复越多,连续性越低。

这让 B-Spline 可以在需要的位置产生更尖锐或更不平滑的局部效果。


13. B-Spline 的限制 #

虽然 B-Spline 很强大,但普通 B-Spline 仍然是多项式曲线。

因此它不能精确表示一些常见曲线,例如:

  • 圆;
  • 椭圆;
  • 某些圆锥曲线。

它可以逼近这些曲线,但不能精确表示。

如果想精确表示圆、椭圆等曲线,需要使用 B-Spline 的推广形式:

NURBS,Non-Uniform Rational B-Spline,非均匀有理 B 样条。

NURBS 在 B-Spline 的基础上加入了权重,因此表达能力更强。


14. 总结 #

B-Spline 曲线的重要性质可以概括为:

性质含义
分段曲线整条曲线由多个 pp 次曲线段组成
低次数可表达复杂形状不需要像 Bézier 那样提高到很高次数
数量关系必须满足 m=n+p+1m=n+p+1
clamped 首尾插值曲线经过 P0P_0PnP_n
强凸包性质每段曲线位于局部控制点凸包内
局部修改移动一个控制点只影响有限范围
连续性由节点重复度决定重复度 kk 的节点处连续性为 CpkC^{p-k}
变差减小曲线不会比控制多边形振荡得更厉害
Bézier 特例Bézier 是 B-Spline 的特殊情况
仿射不变性变换控制点等价于变换曲线

一句话总结:

B-Spline 用“低次数分段曲线 + 局部基函数 + 节点向量”的方式,解决了 Bézier 曲线高次数、全局控制、不便局部修改的问题,因此更适合复杂曲线和曲面设计。

如果只记住一个核心逻辑,可以记成:

节点向量决定基函数,基函数决定控制点权重,控制点权重决定曲线形状\text{节点向量决定基函数,基函数决定控制点权重,控制点权重决定曲线形状}

这也是理解 B-Spline 所有重要性质的主线。

目录