大家好,又见面了,我是你们的朋友全栈君。
一、Bezier曲线
1、Bezier曲线的背景
给定n+1个数据点,p0~pn,生成一条曲线,使得该曲线与这些点描述的形状相符。
(如果要求曲线通过所有数据点,则属于插值问题;如果只要求曲线逼近这些数据点,则属于逼近问题。)
2、Bezier曲线的定义
p ( t ) = ∑ i = 0 n a i f i , n ( t ) p(t) = \sum_{i=0}^n a_if_{i,n}(t) p(t)=i=0∑naifi,n(t)
基函数(无证明)
1972,Forest证明了Bezier曲线的基函数可以简化成伯恩斯坦基函数
B i , n ( t ) = C n i t i ( 1 − t ) n − 1 = n ! i ! ( n − i ) ! t i ( 1 − t ) n − i . B_{i,n}(t)=C_n^i t^{i} {(1-t)}^{n-1}= \frac {n!}{i!(n-i)!}t^i (1-t)^{n-i}. Bi,n(t)=Cniti(1−t)n−1=i!(n−i)!n!ti(1−t)n−i.
∑ i = 0 n B i , n ( t ) 恰 好 是 二 项 式 t + ( 1 − t ) n 的 展 开 式 \sum_{i=0}^n B_{i,n}(t)恰好是二项式{t+(1-t)}^n的展开式 i=0∑nBi,n(t)恰好是二项式t+(1−t)n的展开式
从p0端到pn的末端所形成的折线称为控制多边形或贝塞尔多边形
3、Bezier曲线举例
(1)一次Bezier曲线
p ( t ) = ∑ i = 0 n P i B i , n ( t ) p(t) = \sum_{i=0}^n P_i B_{i,n}(t) p(t)=i=0∑nPiBi,n(t)
t[0,1]
当n=1时,有两个控制点p0和p1,Bezier多项式是一次多项式:
p ( t ) = ∑ i = 0 1 P i B i , 1 ( t ) = P 0 B 0 , 1 ( t ) + P 1 B 1 , 1 ( t ) p(t) = \sum_{i=0}^1 P_i B_{i,1}(t) =P_0 B_{0,1}(t)+P_1 B_{1,1}(t) p(t)=i=0∑1PiBi,1(t)=P0B0,1(t)+P1B1,1(t)
p ( t ) = ( 1 − t ) P 0 + t P 1 p(t) =(1-t)P_0+tP_1 p(t)=(1−t)P0+tP1
即为连接起点p0和终点p1的直线段
(2)二次Bezier曲线
p ( t ) = ∑ i = 0 n P i B i , n ( t ) p(t) = \sum_{i=0}^n P_i B_{i,n}(t) p(t)=i=0∑nPiBi,n(t)
t[0,1]
当n=2时,有3个控制点p0、p1和p2,Bezier多项式是二次多项式:
p ( t ) = ∑ i = 0 2 P i B i , 2 ( t ) = P 0 B 0 , 2 ( t ) + P 1 B 1 , 2 ( t ) + + P 2 B 2 , 2 ( t ) p(t) = \sum_{i=0}^2 P_i B_{i,2}(t) =P_0 B_{0,2}(t)+P_1 B_{1,2}(t)++P_2 B_{2,2}(t) p(t)=i=0∑2PiBi,2(t)=P0B0,2(t)+P1B1,2(t)++P2B2,2(t)
p ( t ) = ( 1 − t ) 2 P 0 + 2 t ( 1 − t ) P 1 + t 2 P 2 p(t) =(1-t)^2P_0+2t (1-t) P_1+t^2 P_2 p(t)=(1−t)2P0+2t(1−t)P1+t2P2
其矩阵形式为:
p ( t ) = [ t 2 t 1 ] ∗ [ 1 − 2 1 − 2 2 0 1 0 0 ] ∗ [ P 0 P 1 P 2 ] p(t) = \begin{gathered} \begin{bmatrix} t^2 & t & 1\end{bmatrix} *\begin{bmatrix} 1 & -2 & 1\\ -2 & 2 & 0\\1 & 0 & 0 \end{bmatrix} *\begin{bmatrix} P_0 \\ P_1 \\ P_2\end{bmatrix} \end{gathered} p(t)=[t2t1]∗⎣⎡1−21−220100⎦⎤∗⎣⎡P0P1P2⎦⎤
(3)三次Bezier曲线
当n=3时,有4个控制点p0、p1、p2和p3,Bezier多项式是三次多项式:
p ( t ) = ∑ i = 0 3 P i B i , 3 ( t ) = P 0 B 0 , 3 ( t ) + P 1 B 1 , 3 ( t ) + P 2 B 2 , 3 ( t ) + P 3 B 3 , 3 ( t ) p(t) = \sum_{i=0}^3 P_i B_{i,3}(t) =P_0 B_{0,3}(t)+P_1 B_{1,3}(t)+P_2 B_{2,3}(t)+P_3 B_{3,3}(t) p(t)=i=0∑3PiBi,3(t)=P0B0,3(t)+P1B1,3(t)+P2B2,3(t)+P3B3,3(t)
p ( t ) = ( 1 − t 3 ) P 0 + 3 t ( 1 − t ) 2 P 1 + 3 t 2 ( 1 − t ) P 2 + t 3 P 3 p(t) =(1-t^3) P_0+3t (1-t)^2 P_1+3 t^2 (1-t) P_2+t^3 P_3 p(t)=(1−t3)P0+3t(1−t)2P1+3t2(1−t)P2+t3P3
每个基函数在参数t的整个(0,1)的开区间范围内不为0
其矩阵形式为:
p ( t ) = [ t 3 t 2 t 1 ] ∗ [ − 1 3 − 3 1 3 − 6 3 0 − 3 3 0 0 1 0 0 0 ] ∗ [ P 0 P 1 P 2 P 3 ] p(t) = \begin{gathered} \begin{bmatrix} t^3 & t^2 & t & 1\end{bmatrix} *\begin{bmatrix} -1 & 3 & -3 & 1\\ 3 & -6 & 3 & 0\\-3 & 3 & 0 & 0\\1 & 0 &0 & 0 \end{bmatrix} *\begin{bmatrix} P_0 \\ P_1 \\ P_2\\P_3\end{bmatrix} \end{gathered} p(t)=[t3t2t1]∗⎣⎢⎢⎡−13−313−630−33001000⎦⎥⎥⎤∗⎣⎢⎢⎡P0P1P2P3⎦⎥⎥⎤
基函数具有递推性
B i , n ( t ) = ( 1 − t ) B i , n − 1 ( t ) + t B i − 1 , n − 1 ( t ) B_{i,n}(t) = (1-t) B_{i,n-1}(t) +t B_{i-1,n-1}(t) Bi,n(t)=(1−t)Bi,n−1(t)+tBi−1,n−1(t)
4、Bezier曲线性质
(1)端点性质
顶点p0和pn分别位于实际曲线段的起点和终点上
(2)一阶导数
基函数的一阶导数为:
B i , n ′ ( t ) = n [ B i − 1 , n − 1 ( t ) − B i , n − 1 ( t ) ] B_{i,n}^{‘}(t) =n[ B_{i-1,n-1}(t) – B_{i,n-1}(t) ] Bi,n′(t)=n[Bi−1,n−1(t)−Bi,n−1(t)]
p ′ ( t ) = n ∑ i = 1 n ( p i − p i − 1 ) B i − 1 , n − 1 ( t ) p^{‘}(t) =n \sum_{i=1}^n (p_i-p_{i-1})B_{i-1,n-1}(t) p′(t)=ni=1∑n(pi−pi−1)Bi−1,n−1(t)
这说明Bezier曲线的七点和终点处的切线方向和特征多边形的第一条边及最后一条边的走向一致
(3)几何不变性
指某些几何特性不随坐标变换而变化的特性。Bezier曲线的形状仅与控制多边形各顶点的相对位置有关,而与坐标系的选择无关
(4)变差缩减性
若Bezier曲线的特征多边形是一个平面图形,则平面内任意直线与p(t)的交点个数不多于该直线与其特征多边形的交点个数,这一性质叫变差缩减性质
此性质反映了Bezier曲线比其特征多边形的波动还小,也就是说Bezier曲线比特征多边形的折线更光滑
5、Bezier曲线的生成
(1)定义法
(2)Bezier曲线的递推(de Castel jau)算法
二、B样条曲线
1、B样条曲线的背景
Bezier曲线存在的不足:
(1)一旦确定了特征多边形的顶点数(n+1)个,也就决定了曲线的阶次(n)次
(2)Bezier曲线或曲面的拼接比较复杂
(3)Bezier曲线或曲面不能作局部修改
2、B样条曲线的定义
B样条曲线的数学表达式为:
P ( u ) = ∑ i = 0 n P i B i , k ( u ) u ∈ [ u k − 1 , u n + 1 ] P(u) = \sum_{i=0}^n P_i B_{i,k}(u) \\u\in[u_{k-1},u_{n+1}] P(u)=i=0∑nPiBi,k(u)u∈[uk−1,un+1]
Bezier曲线:
p ( t ) = ∑ i = 0 n P i B i , n ( t ) p(t) = \sum_{i=0}^n P_i B_{i,n}(t) p(t)=i=0∑nPiBi,n(t)
B{i,k}(u) 称为k阶(k-1)次B样条基函数,k是刻画次数的。其中k可以是2到控制点个数n+1之间的任意整数。
对Bezier曲线来说,阶数和次数是一样的;但对B样条,阶数是次数加1
P ( u ) = ∑ i = 0 n P i B i , k ( u ) P(u) = \sum_{i=0}^n P_i B_{i,k}(u) P(u)=i=0∑nPiBi,k(u)
B样条基函数是一个称为节点矢量的非递减的参数u的序列所决定的k阶分段多项式,这个序列称为节点向量
de Boor-Cox递推定义
B样条基函数可以有各种各样的定义方式,但是公认的最容易理解的是de Boor-Cox递推定义
它的原理是,只要是k阶(k-1次)的B样条基函数,构造一种递推的公式,由0次构造1次,1次构造2次,2次构造3次,依此类推。
B i , 1 ( u ) = { 1 u i < u < u i + 1 0 O t h e r w i s e B_{i,1}(u)=\left\{ \begin{array}{rcl} 1 & & {u_i<u < u_{i+1}}\\ 0 & & {Otherwise}\\ \end{array} \right. Bi,1(u)={
10ui<u<ui+1Otherwise
B i , k ( u ) = u − u i u i + k − 1 − u i B i , k − 1 ( u ) + u i + k − u u i + k − u i + 1 B i + 1 , k − 1 ( u ) B_{i,k}(u)= \frac {u-u_i}{u_{i+k-1}-u_i} B_{i,k-1}(u) +\frac {u_{i+k}-u}{u_{i+k}-u_{i+1}} B_{i+1,k-1}(u) Bi,k(u)=ui+k−1−uiu−uiBi,k−1(u)+ui+k−ui+1ui+k−uBi+1,k−1(u)并约定 0 0 = 0 \frac00=0 00=0
该递推公式表明:若确定第i个k阶B样条B_{i,k}(u),需要用到ui,……ui+k,共k+1个节点,称区间[ui,u_i+k]为B_{i,k}(u)的支撑区间
3、B样条基函数定义区间及节点向量
(1)B样条曲线定义区间是什么?
(2)对于n+1个顶点,k阶的B样条曲线需要多少个节点向量(ui)与之匹配
(1)k阶B样条对应的节点向量数
B i , 1 ( u ) = { 1 u i < u < u i + 1 0 O t h e r w i s e B_{i,1}(u)=\left\{ \begin{array}{rcl} 1 & & {u_i<u < u_{i+1}}\\ 0 & & {Otherwise}\\ \end{array} \right. Bi,1(u)={
10ui<u<ui+1Otherwise
B i , k ( u ) = u − u i u i + k − 1 − u i B i , k − 1 ( u ) + u i + k − u u i + k − u i + 1 B i + 1 , k − 1 ( u ) B_{i,k}(u)= \frac {u-u_i}{u_{i+k-1}-u_i} B_{i,k-1}(u) +\frac {u_{i+k}-u}{u_{i+k}-u_{i+1}} B_{i+1,k-1}(u) Bi,k(u)=ui+k−1−uiu−uiBi,k−1(u)+ui+k−ui+1ui+k−uBi+1,k−1(u)
对于B_{i,1}(1阶0次基函数)来说,涉及ui到u_{i+1}一个区间,及一阶的多项式涉及一个区间两个节点
B_{i,2}是由B_{i,1}和B_{i+1,1}组成,因此B_{i,2}涉及2个区间3个节点;B_{i,3}设计3个区间4个节点……B_{i,k}涉及k个区间k+1个节点
(2)B样条函数定义区间
P ( u ) = ∑ i = 0 n P i B i , k ( u ) u ∈ [ u k − 1 , u n + 1 ] P(u) = \sum_{i=0}^n P_i B_{i,k}(u) \\u\in[u_{k-1},u_{n+1}] P(u)=i=0∑nPiBi,k(u)u∈[uk−1,un+1]
例子:
4、B样条基函数的主要性质
(1)局部支撑性
(2)权性
(3)连续性
(4)分段参数多项式
5、B样条函数的主要性质
(1)、局部性:
k阶B样条曲线上的一点至多与k个控制顶点有关,与其他控制顶点无关
移动曲线的第i个控制顶点pi,至多影响到定义在区间上那部分曲线的形状,对曲线其余部分不发生影响
(2)、变差缩减性(同Beizer)
(3)、几何不变性
(4)、凸包性:
6、B样条曲线类型的划分
(1)、均匀B样条曲线(uniform B-spline curve)
当节点沿参数轴均匀等距分布,即u_{i+1}-ui=常熟>0时,表示均匀B样条函数
{0,1,2,3,4,5,6}
均匀B样条的基函数呈周期性。即给定n和k,所有基函数有相同形状。每个后续基函数仅仅是前面基函数在新位置上的重复
(2)准均匀B样条曲线(Quai-uniform B-spline curve)
与均匀B样条曲线的差别在于两端节点具有重复度k,这样的节点矢量定义了准均匀的B样条基
均匀:u=(0,1,2,3,4,5,6)
准均匀:u=(0,0,0,1,2,3,4,5,5,5)
(3)、分段Bezier曲线
(4)非均匀B样条曲线
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/151260.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...