数学预备知识:控制点、节点向量、基函数、阶数与次数的概念
好,咱们正式开始聊B样条曲线。在进入正题之前,我得先跟你聊聊几个基础概念。说实话,我见过不少工程师,一上来就调控制点、改节点向量,结果曲线乱飞,根本不知道问题出在哪。说白了,就是数学底子没打牢。
这一节,我带你把这四个核心概念捋清楚。控制点、节点向量、基函数、阶数与次数。嗯,一个一个来。
1. 控制点(Control Points)
控制点,顾名思义,就是用来「控制」曲线形状的点。你可以把它想象成一根绳子上的几个钉子——你移动钉子,绳子形状就跟着变。
在B样条曲线中,控制点通常记作 Pi,i = 0, 1, ..., n。每个控制点都是一个二维或三维坐标点。曲线本身并不一定穿过这些点,但曲线的形状会被它们「拉」过去。
重要性质:控制点具有局部性。移动一个控制点,只会影响曲线的一部分,而不是整条曲线。这一点比贝塞尔曲线强太多了。
我在项目中遇到过一件事:有个同事想调整机器人末端轨迹的某一段,结果他移动了一个控制点,整条曲线都变了。我一看,他用的是贝塞尔曲线。后来换成B样条,局部调整就轻松多了。
2. 节点向量(Knot Vector)
节点向量,这是B样条曲线里最容易被忽视的概念。很多人觉得它就是个参数列表,其实不然。
节点向量记作 U = {u0, u1, ..., um},其中 m = n + p + 1。这里的 p 是曲线的次数,n+1 是控制点数量。
节点向量决定了曲线在参数空间中的「分段」方式。说白了,它告诉曲线:你在哪一段用哪一组基函数。
| 节点向量类型 | 特点 | 常见应用 |
|---|---|---|
| 均匀节点向量 | 节点等距分布 | 简单曲线拟合 |
| 非均匀节点向量 | 节点不等距 | 复杂形状、插值 |
| 开放节点向量 | 首尾节点重复 p+1 次 | 曲线经过首尾控制点 |
我的习惯:做轨迹规划时,我一般用开放节点向量。这样曲线起点和终点刚好落在第一个和最后一个控制点上,方便对接前后轨迹段。
3. 基函数(Basis Functions)
基函数,这才是B样条曲线的灵魂。你想想看,控制点有了,节点向量有了,怎么把它们联系起来?靠的就是基函数。
B样条基函数通常用 Ni,p(u) 表示,其中 i 是基函数索引,p 是次数,u 是参数。它通过Cox-de Boor递推公式定义:
Ni,0(u) = 1 如果 ui ≤ u < ui+1
= 0 否则
Ni,p(u) = (u - ui) / (ui+p - ui) * Ni,p-1(u)
+ (ui+p+1 - u) / (ui+p+1 - ui+1) * Ni+1,p-1(u)
这个公式看着有点吓人,对吧?我第一次看的时候也懵了。后来我把它拆开理解:
- 0次基函数就是个开关——参数落在哪个区间,哪个基函数就为1
- 高次基函数是两个低次基函数的线性组合
- 每个基函数只在局部区间非零,这就是局部性的数学根源
避坑指南:我曾经在计算基函数时,忽略了分母为零的情况。当节点重复时,分母可能为零。记得加一个很小的epsilon做保护,或者直接判断跳过。
4. 阶数与次数(Order and Degree)
这两个概念经常被搞混。我简单说一下:
- 次数(Degree)p:基函数的多项式次数。比如p=3就是三次曲线。
- 阶数(Order)k:k = p + 1。阶数表示基函数覆盖的节点区间个数。
举个例子:三次B样条曲线,次数p=3,阶数k=4。这意味着每个基函数会覆盖4个节点区间。
为什么要有阶数这个概念?因为有些教材习惯用阶数来描述。你看到「k阶B样条」,其实就是p=k-1次。我个人习惯用次数,因为更直观——次数越高,曲线越光滑。
关键关系:
- 控制点数量 n+1 ≥ 阶数 k
- 节点数量 m+1 = n + p + 2
- 曲线在节点处的连续性为 Cp-1
知识体系总览
下面这张图,我把这四个概念的关系画出来了。你看一眼,应该就能明白它们是怎么配合的。
你看这张图就清楚了。控制点提供位置信息,基函数提供权重分配,节点向量决定参数分段,阶数与次数则控制整体光滑度。四者缺一不可。
一个小技巧:如果你刚开始学B样条,我建议你先从三次均匀B样条入手。控制点少、节点向量简单、基函数也好算。等熟悉了,再玩非均匀、高阶的。
好了,数学预备知识就聊到这儿。这些概念你理解了,后面讲曲线构造、插值、优化,你就能跟上节奏了。