极形式
极形式是计算机图形学中用于处理样条曲线和曲面的数学工具, 它是一种将多项式表示为多重仿射函数的方法,它具有对称性和多重仿射性的性质.
例如对于多项式 P(t)=at3+bt2+ct+d, 我们可以将它改写为 P(t)=a⋅t⋅t⋅t+b⋅t⋅t+c⋅t+d, 则这一多项式的极形式就是
P(t)=a⋅t1t2t3+b(t1t2+t2t3+t3t1)/3+c(t1+t2+t3)/3+d
如下图是一段 3 阶 Bézier 曲线, 其中的点就是 Bézier 曲线的控制点和 de Casteljau 算法的中间点, 这些点恰好可以用极形式进行表示. 在后文中将介绍极形式的具体定义, 以及为什么可以用极形式表示这些点.
定义
仿射组合
在介绍极形式的定义之前, 我们需要先介绍仿射组合的概念.
n 个 Rd 中点的仿射组合 (Affine Combination) 指的是
Pα=i=1∑nαipi with i=1∑nαi=1
某一函数 f=f(x1,…,xm) 对于它的参数 xi 是仿射的指的是
f(x1,…,i=1∑nαixi(k),…,xm)=i=1∑nαif(x1,…,xi(k),…,xm) for i=1∑nαi=1
两个点和三个点的仿射组合如下图所示.
注意到, 仿射组合与凸组合 (Convex Combination) 的区别只是, 凸组合的每一个系数都是非负的. 事实上, 凸组合就是一种特殊的仿射组合, 也可以将仿射组合理解为凸组合的一种推广, 两个点的所有凸组合是它们相连得到的线段, 所有仿射组合是它所确定的直线, 三个点的所有凸组合是它们构成的三角形的闭包, 仿射组合是它所确定的平面.
直觉地来看, de Casteljau 算法就是不断计算凸组合的过程, 从这一点出发我们可以注意到 Bézier 曲线与极形式之间的紧密联系.
极形式的定义
对于一个 n 阶的多项式 F:R→R, 若 f:Rn→R 是满足以下条件的函数:
- Diagonality: f(t,t,…,t)=F(t),
- Symmetry: f(t1,t2,…,tn)=f(tπ(1),tπ(2),…tπ(n)), 其中 π 是 (1,…,n) 的任意一个置换,
- Multi-affine: f 对它的每一个参数都是仿射的 (或者说是线性的),
则称 f 是 F 的多重仿射极形式 (Multi-affine Polar Form) 或开花 (Blossom).
可以通过单项式的极形式得到任意一个多项式的极形式:
- 0 阶: 1→1
- 1 阶: 1→1, t→t
- 2 阶: 1→1, t→2t1+t2, t2→t1t2
- 3 阶: 1→1, t→3t1+t2+t3, t2→3t1t2+t2t3+t1t3, t3→t1t2t3
- n 阶: tk→(kn)−1∑∣S∣=kS⊂{1,...,n}∏i∈Sti
F(t)=k=0∑ncktk→f(t1,…,tn)=k=0∑n(kn)−1∣S∣=kS⊂{1,…,n}∑i∈S∏ti
不难验证, 每个单项式对应的极形式是唯一的, 进而多项式与极形式是一一对应的.
注 多项式与极形式是一一对应的, 指的是对于一个 n 阶的多项式 F, 存在唯一的多重仿射函数 f:Rn→R 是它的极形式. 但是我们可以在形式上假定一个 n 阶的多项式是 n+1 阶的 (只不过它的 n+1 次项的系数为 0), 并得到一个有 n+1 个参数的极形式, 这不与多项式与极形式是一一对应的相矛盾. 事实上, 这就是极形式的升阶, 在后文中将介绍它的应用.
极形式, Bézier 曲线和 de Casteljau 算法
上文中已经给出过结论, 一条定义在 [0,1] 上的 Bézier 曲线 F(t) 的控制点和 de Casteljau 算法的中间点都可以用 f(0,…,0,1,…,1,t,…,t) 来表示, 接下来我们将证明这一结论.
我们知道 Bézier 曲线的显示表达式为
F(t)=k=0∑nBkn(t)pk
设它的极形式为 f(t1,…,tn), 只需验证 f(0,…,0重复n−k次,1,…,1重复k次)=pk.
由归纳法
F(t)=f(t,…,t)=(1−t)f(t,…,t,0)+tf(t,…,t,1)=(1−t)2f(t,…,t,0,0)+2t(1−t)f(t,…,t,0,1)+t2f(t,…,t,1,1)=B02(t)f(t,…,t,0,0)+B12(t)f(t,…,t,0,1)+B22(t)f(t,…,t,1,1)=⋯=k=0∑nBkn(t)f(0,…,0重复n−k次,1,…,1重复k次)
又因为 Bernstein 基函数是 n 阶多项式空间的基, 知 f(0,…,0重复n−k次,1,…,1重复k次)=pk.
注 事实上, 可以在这一证明中, 将区间 [0,1] 替换为任意区间 [r,s], 并得到这一条 Bézier 曲线在 [r,s] 上的控制点. 这一结论还可以用于 Bézier 曲线的细分.
注2 从这里的推导可以联想到, 在 B 样条的结点向量中适当地重复结点, 可以得到 Bernstein 基函数.
升阶
给定极形式 f(t1,…,tn), 可以用下式对其进行升阶
f(+1)(t1,…,tn+1)=n+11k=0∑nf(t1,…,tk−1,tk+1,…tn+1)
注 事实上, 我们可以直接把 F(t) 当作高阶多项式来写出它的极形式, 进而实现 Bezier 曲线的升阶这样的操作.
导数
我们可以将极形式的定义域从点集扩展到点和向量的集合. 称 t 为点, 而 v^ 为向量, 向量是两个点之间的差: v^=p−q. 递归地定义极形式
f(t1,…,tn−k,v^1,v^2,…,v^k)=f(t1,…,tn−k,p1,v^2,…,v^k)−f(t1,…,tn−k,q1,v^2,…,v^k)
显然, 对 pi 和 qi 作一个平移, 所得到的 f(t1,…,tn−k,v^1,…,v^k) 的值不会改变, 因此这一定义是合理的.
利用向量域上的极形式, 我们可以给出 F 的导数
dtrdrF(t)=(n−r)!n!f(重复n−r次t,…,t,重复r次1^,…,1^)
这一结论的证明可以归约为单项式的一阶导数的情况, 而这是容易证明的.
基的变换
假设有一条多项式曲线 F(t)=∑k=0ncktk, 则可以通过改写为极形式, 得到它作为区间 [a,b] 上的 Bézier 曲线的控制点:
pk=f(重复n−k次a,…,a,重复k次b,…,b)
极形式, B 样条和 de Boor 算法
在上文中, 我们已经实现了将 de Casteljau 算法改写为极形式的语言, 那么对于与它非常相像的 de Boor 算法, 是否也可以做类似的操作? 答案是可以, 但只能做到形式上类似.
以下的讨论将沿用上一篇笔记中推导 de Boor 算法所采用的记号.
首先, 假设 t∈[tl,tl+1), 则有
p(t)=pl(d)(t)=(1−αl(d−1)(t))pl−1(d−1)(t)+αl(d−1)(t)pl(d−1)(t)=tl+1−tltl+1−tpl−1(d−1)+tl+1−tlt−tlpl(d−1)(t)
与 de Casteljau 算法类似地, 可以将上式改写为
f(t,…,t重复d次)=tl+1−tltl+1−tf(t,…,t,tl)+tl+1−tlt−tlf(t,…,t,tl+1)
递推可知, 影响 f(t) 的 de Boor 点为 {f(tl−d+1,…,tl),f(tl−d+2,…,tl+1),…,f(tl,…,tl+d−1)}.
下图中给出了更为直观的递推过程, t∈[t3,t4), d=3.
通过这种方式, 我们就可以用极形式的语言来简单地表述 de Boor 算法, 下图是用这一方法绘制 B 样条曲线的例子.
值得注意的是, 因为 B 样条是分段的多项式, 所以极形式当然也是分段的, 并且很难找出它的显式表达式 (就像很难找出 B 样条曲线的的显式表达式一样). 但笔者认为这或许是没有必要的, 我们暂时只认为极形式在这里只担任表述 de Boor 算法的角色即可.