Skip to content

算法Algorithm

节点插入与不变曲线

Boehm knot insertion · Spline knot insertion

插入一个节点后局部更新控制系数,证明新旧表示为同一函数,并把细化用于分段多项式提取。

形式陈述 ​

给定次数 p≥1、B样条的夹持节点向量 t 和系数 c0,…,cN−1。要把一个内部点 u∈(a,b) 插入一次,记其原重数为 r,要求 0≤r≤p;取 k 为满足 tk≤u<tk+1 的非零跨度下标。新向量 t′ 在 tk 后插入 u,新系数为

ci′={ci,0≤i≤k−p,(1−αi)ci−1+αici,k−p+1≤i≤k−r,ci−1,k−r+1≤i≤N,αi=u−titi+p−ti.

中间范围可能为空。其实际分母严格为正,且 0≤αi≤1。输出满足逐点恒等式

∑i=0N−1ciBi,p(x;t)=∑i=0Nci′Bi,p(x;t′)(a≤x≤b),

使用同一内部右连续、右端左极限约定。这一步增加一个系数,不增加次数,也不重新拟合数据。

直觉

新节点把允许的样条空间放大,原曲线仍然在其中。插结只回答“原曲线在细一点的局部基下如何存储”。离新节点很远的基没有变化,附近的系数才需要混合。

把 αi 补成 i≤k−p 时为一、i≥k−r+1 时为零,单节点的基细化恒等式为

Bi,p(x;t)=αiBi,p(x;t′)+(1−αi+1)Bi+1,p(x;t′).

下面用差商证明细化恒等式。对固定且不等于任何节点的 x,令 gq(z)=(z−x)+q,g0(z)=1(x,∞)(z)。有

Bi,p(x;t)=(ti+p+1−ti)[ti,…,ti+p+1]gp.

先对互异节点验证。p=0 时右侧为 g0(ti+1)−g0(ti),正是区间指标。对更高次数,用 gp=(z−x)gp−1;差商乘积法则给

(b−a)[a,…,b]gp=(x−a)[a,…,ap]gp−1+(b−x)[a1,…,b]gp−1,

其中 a=ti,a1=ti+1,ap=ti+p,b=ti+p+1。除以低阶基的各自支撑长度,就得到 Cox–de Boor 递推,归纳成立。这里的乘积法则也可直接从差商递推推得:乘以一次式只留下该式的零阶和一阶差商。

设 a<u<b,记 D=[a,a1,…,ap,b]gp、DL=[a,a1,…,ap,u]gp、DR=[u,a1,…,ap,b]gp。差商的对称性与递推给

D−DL=(b−u)Dall,DR−DL=(b−a)Dall,

其中 Dall 使用加入 u 的全部节点。消去它得

(b−a)D=(u−a)DL+(b−u)DR.

把各节点排序后,左新基的支撑长度为 max(ap,u)−a,右新基为 b−min(a1,u)。因此两个系数分别为

u−amax(ap,u)−a,b−ub−min(a1,u),

即 αi 与 1−αi+1,分母一般不同。u 在支撑之外时对应不变或移位的基。重复节点由节点合并极限得到:查询点远离节点,gp 在每个节点附近光滑,合流差商使用相应导数除以阶乘;零支撑基省略。再由单侧极限恢复所有节点值及右端值。

最后把恒等式乘 ci 求和。固定一个新基 Bi,p(t′),它从旧第 i 项收到 αici,从旧第 i−1 项收到 (1−αi)ci−1。这里才出现同一 αi,得到系数更新及整条曲线的不变性。

计算只有至多 p−r 次混合;构造整个新数组还需 O(N) 次复制。把“算几个新系数”的代价与“输出完整新数组”的代价分开,才不会遗漏数据移动。

例子与边界

对

p=2,t=(0,0,0,1,1,2,3,3,3),c=(0,1,2,0,1,3),

插入 u=3/2。这里 k=4,r=0,只混合 i=3,4:α3=1/2、α4=1/4。结果是

t′=(0,0,0,1,1,3/2,2,3,3,3),c′=(0,1,2,1,1/4,1,3).

新表示在 u 的两个活跃基值为 1/2,1/2,读出 1/2+1/8=5/8,等于旧表示。更强的验证是分段恒等:旧曲线在 1≤x≤2 上为 2−4(x−1)+5(x−1)2/2;新表示在 [1,3/2] 和 [3/2,2] 各展开一次,均得到这一多项式。两侧其他跨度完全不变,所以相同并非只由几个样本推断。

再在原来的二重节点 1 插入一次,有 r=p=2,中间范围为空,结果仅把系数二重复:c′=(0,1,2,2,0,1,3)。新空间允许跳变,这条旧曲线却仍连续,因为断点左右端系数一致。若随后把右侧的二改为三,才会真正引入跳变。

已经满重数的点不能再按本接口插入;端点也不接受额外插入。它们不是数学上绝无其他表示,而是当前夹持、无冗余约定下的输入边界。节点删除则要检查相邻多项式是否满足更强拼接条件,不能简单删掉一个系数。

推论与应用

将每个内部节点补到重数 p,连续分段曲线可逐段读作 Bernstein 表示;若本来有满重数跳点,则该点两侧分别提取。因每段 Bernstein 基非负且和为一,局部系数的最小值、最大值给整段值域包围。进一步细分有时能把这个界收紧,连接到误差证书。

在同一查询点反复插入,局部混合表与de Boor 求值相连。求值最后只要一个数,插结保留完整细化表示;二者共享运算机制,但输出接口不同。

参考资料
  • Carl de Boor,B(asic)-Spline Basics,§11,Algorithm 11 与式 (11.3),以及末尾 Conversion to BB-net:插入、系数凸组合和分段提取。
  • Wolfgang Boehm,Inserting new knots into B-spline curves,Computer-Aided Design 12(4), 1980, 199–201:原始插结算法。算法证明的开放全文入口采用上面的 de Boor 作者讲义。
关系图谱6 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系