第四章 曲线和曲面 第一节 曲线和曲面表示的基础知识 第二节 Hermite多项式 第三节 Coons曲面 第四节 Bezier曲线和曲面 第四章 曲线和曲面 第一节 曲线和曲面表示的基础知识 第二节 Hermite多项式 第三节 Coons曲面 第四节 Bezier曲线和曲面 第五节 B样条曲线和曲面
第一节 曲线和曲面表示的基础知识 1.显式、隐式和参数表示 ①显式: y=f(x) 不能表示封闭曲线或多值曲线(圆) ②隐式:f(x,y)=0,f(x,y,z)=0 球面
(2)无法解决斜率为无穷大的情况; (3)对于空间复杂曲线曲面很难表示 (4)不便于计算和编程 显式隐式表示的缺点 (1)与坐标轴相关的,不便于坐标变换; (2)无法解决斜率为无穷大的情况; (3)对于空间复杂曲线曲面很难表示 (4)不便于计算和编程
③ 参数表示(解决上述问题) 空间曲线: ,, 矢量表示是:
对参数t求导: 曲面: 曲线或曲面的某一部分,可以简单地用a≤t≤b界定它的范围
空间直线段 P1[x1,y1],P2[x2,y2] P(t)代表曲线上的一点 P(t)= P1+( P2- P1) t = (1-t)P1+ tP2
参数方程具有如下优点: 有更大的自由度来控制曲线、曲面的形状。 便于坐标变换 便于处理斜率为无限大的问题,不会因此中断计算 代数、几何相关和无关的变量是完全分离的,而且对变量个数不限,便于向高维空间扩展。 t∈[0,1], 直接定义了边界。便于曲线和曲面的分段、分片描述。 易于用矢量和矩阵表示,从而简化了计算。
1.插值:要求构造一条曲线顺序通过型值点,称为对这些型值点进行插(interpolation)。 基本概念 1.插值:要求构造一条曲线顺序通过型值点,称为对这些型值点进行插(interpolation)。 给定函数f(x)在区间[a,b]中互异的n个点的值f(xi) i=1,2,…n,基于这些数据寻找某一个函数 ,要求 , 为f(x)的插值函数,xi为插值节点 (1)线性插值 函数f(x)在两个不同点x1,x2的值,y1=f(x1),y2=f(x2) 用线性函数 近似代替y=f(x),选择a,b使 则称 为f(x)的线性插值函数
(2)抛物线插值(二次插值) 设已知f(x)在三个互异点x1,x2,x3的函数值为y1,y2,y3,要求构造函数 在节点xi处有
2,逼近 构造一条曲线,使它在某种意义上最佳逼近这些型值点,称之为对这些型值点进行逼近(approximation)。
常用方法 最小二乘法 假设已知一组型值点(xi,yi), i=1,2,…n,要求构造一个m(m<n-1)次多项式函数y=F(x)逼近这些型值点。 偏差的平方和最小: 或加权平方和最小: 令F(x)为一个m次多项式 最小二乘法就是定出ai使偏差平方和最小
3.参数曲线的代数形式和几何形式 一条三次参数曲线的代数形式: 矢量形式: 给定P(0),P(1),以及P’(0),P’(1)
解四个方程,求得参数 令 参数曲线的几何形式
矩阵形式表示参数曲线: P=TA 其中 P=FB P=TMB表示一条参数曲线
参数连续性 一函数在某一点x0处具有相等的直到k阶的左右导数,称它在x0处是k次连续可微的,或称它在x0处是k阶连续的,记作Ck。几何上C0、C1、C2依次表示该函数的图形、切线方向、曲率是连续的。参数曲线的可微性称为参数曲线的连续性。 几何连续性 两曲线段的相应的弧长参数化在公共连接点处具有Ck连续性,则称它们在该点处具有k阶几何连续性,记作Gk 。零阶几何连续G0与零阶参数连续C0是一致的。一阶几何连续G1指一阶导数在两个相邻曲线段的交点处成比例,即方向相同,大小不同。二阶几何连续G2指两个曲线段在交点处其一阶和二阶导数均成比例。
4.曲线段间 和 连续性定义 (1)Q1(1)=Q2(0),则Q1(t)和Q2(t)在P处有 和 连续性 (2) Q1(1)和Q2(0)在P处重合,且其在P点处的切矢量方向相同,大小不等, 则Q1(t)和Q2(t)在P处有 连续性 (3) Q1(1)和Q2(0)在P处重合,且其在P点处的切矢量方向相同,大小相等,则Q1(t)和Q2(t)在P处有 连续性 (4) Q1(1)和Q2(0)在P处已有 连续 且 大小方向均相同,则Q1(t)和Q2(t)在P处有 连续性 推广之,Q1(1)和Q2(0)在P处已有 连续,若 在P处大小和方向均相同,则说Q1(t)和Q2(t)在P处具有 连续性
(5). Q1(1)和Q2(0)在P处已有 连续 且 方向相同但大小不等,则Q1(t)和Q2(t)在P处有 连续性 5.光顺 光顺(smoothness)是指曲线的拐点不能太多,要光滑顺畅。对于平面曲线相对光顺的条件应该是:(1)具有二阶几何连续(G2);(2)不存在多余拐点和奇异点;(3)曲率变化较小
第二节 Hermite多项式 已知函数f(t)在k+1个点{ti}处的函数值和导数值{f (j)(ti)},i=0,1,…,k,j=0,1,…,mi-1,要求确定一个N = m0 + m1 + … + mk- 1次的多项式P(t),满足下面的插值条件:
1. Lagrange插值法: 已知f(t)在k+1个点的函数值f ( ti ) ,求一个k次多项式使p(ti)=f (ti)
例: k=2,m0=m1=m2=1 已知函数f(t)在三个点t0,t1,t2,的函数值f(t0), f(t1),f(t2), 求三次多项式P(t)
混合函数如下:
2. 已知表示一条曲线的某个函数f(t)在两点t0,t1的函数值f(t0), f(t1)和一阶导数值f’(t0), f’(t1),求三次多项式P(t):
把a0,a1,a2和a3代入则有:
式中选取两个端点及其及其切向量作为曲线构造条件 混合函数如下: 经整理,所求多项式P 0(t)可以写出如下: 式中选取两个端点及其及其切向量作为曲线构造条件 混合函数如下:
经验证可知:
3. 为了使P0(t)的定义区间t0≤t≤t1变为区间0≤u≤1,可以做如下变换 解出 ,代入混合函数式中,得:
将关于u的混合函数代入,所求的三次多项式成为:
令
得
4.曲线拼接 对一般的Hermite插值问题,一般来说得到的插值多项式次数较高,应用起来不方便。通常的处理办法是将前面给出的参数的三次多项式逐段光滑地连接,如此来确定一般情况下的插值多项式。 将前面t0和t1视为ti和ti+1,设给定f(ti),f(ti+1),f’(ti),f’(ti+1),则在区间[ti,ti+1]的Hermite三次插值多项式Pi(t)是:
为了完整地写出这个插值多项式,可以在区间[ti,ti+1]中引入如下一些基本函数:
完整的插值多项式可写为: 上式区间[t0,tn]中有定义,且为分段定义。在每个区间 [ti,ti+1]上,都恰有四项。满足插值条件
每段曲线Pi(t)只在[ti,ti+1]中有定义:
自变量的线性变换 用逆变换 代入,将所得关于u的多项式记为 ,得
其中 = =
例:设在平面上有两点P0,Pl,它们的位置向量分别为(1,1),(4,2),在P0的导数值即在该点的切线向量P’0 =(1,1),在Pl处P’1 =(1,-1),构造曲线。
第三节 Coons曲面
uw表示了曲面片的方程 0w,1w,u0,u1四条边界曲线 u0u边界线的切向量 u0w 边界线的跨界切向量 uwuu,uwuw,uwww曲面片uw关于u和w的二阶偏导数向量 u0uu 表示边界线u0上的二阶切向量 u0ww表示边界线u0上的二阶跨界切向量 uwuw为曲面片P在点(u,w)处的扭曲向量。 00,01,10,11表示曲面片四个角点 00w,01w,10w,11w,00u,01u,10u,11u 四个角点的切向量 00uw,01uw,10uw,11uw四个角点的扭曲向量
构造具有指定边界曲线的曲面片: Coons给出的一个解法是:寻找两个混合函数f0(t)和f1(t),它们是连续的,并且满足f0(0)=1,f0(1)=0,f1(0)=0,f1(1)=1,且f0(t)+f1(t)=1,0≤t≤1。 f0(t)=2t3-3t2+1,f1(t)=-2t3+3t2 f0(t)=1-t,f1(t)=t
问题1:求通过四条边界线的曲面 给定四条边界曲线u0,u1,0w,1w,且0≤u≤1,0≤w≤1 ①在u向进行线性插值,得到直纹面为:
②在w向进行线性插值,得到直纹面为: ③ ① ②叠加可得到一张新曲面P3(u,w)其边界恰好为无用的直线边界 :
④ 构造Coons曲面P(u,w) P(u,w)=P1(u,w)+ P2(u,w)- P3(u,w) 可写成如下形式:
例如我们来验证0w是它的一条边界线,这只要把u=0代入公式右端,得
问题2: ①边界线为指定曲线 ②且有指定的跨界切向量 。 应用上节定义的四个混合函数q00(u), q01(u), q10(u), q11(u)。
这四个函数均是三次多项式。故连续可微,并且还满足下面的条件:
设已知四条边界曲线u0,u1,0w,1w 及沿这四条边界曲线的跨界切向量 u0w,u1w,0wu,1wu。 求出四个角点的位置向量00,01,10,11, 切向量00w,01w,10w,11w,00u,01u,10u,11u, 扭曲向量00uw,01uw,10uw,11uw, 写出符合要求曲面片的数学表达式如下:
验证通过边界0w
验证满足跨界切向量0wu:
问题3: 指定四个角点以及在这些点上的切向量和扭曲向量后,求解曲面的表达式。 计算求得四个角点的位置向量00,01,10,11,切向量00w,01w,10w,11w,00u,01u,10u,11u,以及扭曲向量00uw,01uw,10uw,11uw,
已知角点位置向量00,10以及在这两点关于u的切向量00u和01u,可以用Hermite插值公式来指定一条u边界线:
将上两式代入前式,就可以得到:
例: 给出四个角点以及在该角点上的切向量和扭曲向量来构造Coons曲面表达式。设在平面上有四点P0,Pl,P2,P3,它们的位置向量分别为(0,0,0),(0,0.75,0),(0.75,0,0),(0.75,0.75,0)。该四点的切向量、跨界切向量和扭曲向量,定义在关于角点的信息矩阵M中:
第四节 Bezier曲线和曲面 1.Bezier曲线定义 给出型值点P0,P1,…,Pn,它们所确定的n次Bezier曲线是:
是Bernstein多项式,调和函数 涉及到的0!及00,按约定均为1。 当n=1时
在n=2时
在n=3时
① ② ③ ④
2.Bezier曲线的一些重要性质: ① 端点性质:P(0)= P0,P(1)= Pn,曲线通过起点和终点。 ②
③ Bezier曲线的对称性
④曲线的凸包性 对给定的型值点P0,P1,…,Pn
P0P1P2P3和Q0QlQ2Q3,两个bezier多边形 ①曲线在连接点处C0连续的条件是P3=Q0 ② 曲线在连接点处G1连续,Q‘0=aP’3 Q'0=3(Q1—Q0),P'3=3(P3—P2), Q1-Q0=a(P3-P2)
由此得 ③连接点处C2连续的条件 对前面的公式求两次导数,可得,
于是知, 要求, 即 注意到Q0=P3,由此得:
4. Bezier曲线绘制 ①利用定义式 Bezier曲线的绘制,可以利用其定义式,对参数t选取足够多的值,计算曲线上的一些点,然后用折线连接来近似画出实际的曲线。随着选取点增多,折线和曲线可以任意接近。 假设给定的四个型值点是P0=(1,1),Pl=(2,3),P2=(4,3), P3=(3,1),则计算结果见表
t (1-t)3 3t(1-t)2 3t2 (1-t) t3 P(t) 1 (1,1) 0.15 0.614 0.325 0.0574 0.0034 (1.5058,1.765) 0.35 0.275 0.444 0.239 0.043 (2.248,2.376) 0.5 0.125 0.375 (2.75,2.5) 0.65 (3.122,2.36) 0.85 (3.248,1.75) (3,1)
记点Pk,Pk+l,…,Pl可以生成的Bezier曲线为Pk,l(t),0≤t≤1,则成立下面的递推关系 ②利用曲线性质(几何作图法和分裂法) a.几何作图法 记点Pk,Pk+l,…,Pl可以生成的Bezier曲线为Pk,l(t),0≤t≤1,则成立下面的递推关系
上式改写为:
几何作图法伪代码语言实现:
void bez_to_points(int n, double P[], int npoints, double points[]) //控制点P的个数为n +1 //points存储Bezier曲线上的离散点序列 //离散点序列points的个数为npoints+1 { double t,delt; delt=1.0/(double)npoints;//将参数t npoints等分 t=0.0; for(int i=0;i<=npoints;i++) { points[i]=decas(n, P, t); //分别求出npoints+1个离散点points的坐标 t+=delt; }
double decas(int n,double P[],double t) { int m,i; double *R, *Q, P0; R = new double[n +1]; Q = new double[n +1]; for(i=0;i<=n;i++) R[i]= P [i]; //将控制点坐标P保存于R中
for(i=0;i<= m -1;i++) Q[i]= R [i]+t*( R [i+1]- R [i]); R[i]= Q [i]; //n次Bezier曲线在点t的值,可由两条n-1次Bezier曲线在点t的值通过线性组合而求得。 for(m=n;m>0;m--) { for(i=0;i<= m -1;i++) Q[i]= R [i]+t*( R [i+1]- R [i]); R[i]= Q [i]; } P0=R[0]; delete R;delete Q; return (P0);
设给出四点的坐标是(1,1),(2,3),(4,3),(3,1),求所确定三次Bezier曲线在t=1/3时的值P(1/3),算法的计算过程
如果令Pa(s)和Pb(s)分别是以控制点序列 和 , 确定的Bezier曲线,其中0≤s≤1,那么就有: 思想:将原控制点集分为两个点数相同的新控制点集,分别对应原曲线的前半段和后半段,新控制点集比原控制点集更接近直线,分裂过程继续进行,控制点集会迅速向曲线靠近,当满足某个允许的界限时,可依次连接各点的折线来表示曲线 设控制点序列P0,P1,…,Pn确定的n次Bezier曲线是P(t),用如下递归方式计算另一组点集: 如果令Pa(s)和Pb(s)分别是以控制点序列 和 , 确定的Bezier曲线,其中0≤s≤1,那么就有:
己知四点P0,P1,P2,P3,确定了一条三次Bezier曲线P(t),可写出下式,
分裂法中的递归计算
分裂法的示意图
验证Bezier曲线分成前后两段的正确性, P0的系数为例,验证两端它的系数是相等的。
设己知三次Bezier曲线P(t)的控制顶点是P0,P1,P2,P3,在P( )处将曲线分为两段,求出前半段的控制顶点Q0,Ql,Q2,Q3和后半段的控制顶点R0,R1,R2,R3,。有算法如下 void split_Bezier(Point P[]) { Point R[4],Q[4]; int i,j; for(i=0;i<=3;i++) R[i]=P[i]; for(i=0;i<=2;i++) { Q[i]=R[0]; for(j=0;j<=2-i;j++) { R[j].x=(R[j].x+R[j+1].x)/2; //分别对相邻两控制点间的线段进行分裂 R[j].y=(R[j].y+R[j+1].y)/2; } Q[3]=R[0];
分裂算法的计算
分裂中止的条件: max(d(P1,P0P3),d(P2,P0P3))<ε
void new_split_Bezier(Point P[]) { Point R[4],Q[4]; int i,j; const double epsilon=0.01; if (maxdistance(P)<epsilon) /*maxdistance(P)为求max(d(P1,P0P3),d(P2,P0P3))的函数*/ { MoveTo(P[0].x,P[0].y); LineTo(P[3].x,P[3].y); } else { for(i=0;i<=3;i++) R[i]=P[i]; for(i=0;i<=2;i++) { Q[i]=R[0]; for(j=0;j<=2-i;j++) {R[j].x=(R[j].x+R[j+1].x)/2; R[j].y=(R[j].y+R[j+1].y)/2; Q[3]=R[0]; new_split_Bezier(Q);new_split_Bezier(R);
5.有理Bezier曲线
图中h0=h1= h3=1,当h2=0、1/2、1、2、4时曲线逐渐地靠近P2点
6.Bezier曲面 上式曲面为m×n次的Bezier曲面 若在空间给定(m+1)(n十1)个控制点,Vij,i=0,1,…,m,j=0,1,…,n,令 上式曲面为m×n次的Bezier曲面
当m=n=1,公式成为:
设v00,v01,v10,v11四点依次是(0,0,0),(1,0,0),(0,1,0),(0,0,1),则可得P1,1(u,w)的坐标形式的参数方程为: 消去参数,就得马鞍面方程:
当m=n=3,曲面成为:
7.双三次bezier曲面和双三次Coons曲面之间的关系 设同一个曲面片,用Coons曲面形式确定它,又用Bezier形式确定它,现在来考查、矩阵M与矩阵B有什么关系。 求解上式得:
四个角点00,0l,10和11分别对应控制点V00,V03,V30和V33。切向量,例如00w=3(V01-V00),表明00w,是沿从V00到V01边的方向,大小是两个位置向量差的3倍,其余切向量是类似的。 V10,V00沿w方向的切向量之差的三倍 V01,V00 沿u方向的切向量之差的三倍
扭曲向量只与中间四个控制点有关系
双三次Coons曲面与Bezier曲面间的关系
一.B样条曲线(构造具有局部性的调和函数) 给定n+1个控制点P0,P1,…,Pn,它们所确定的k阶B样条曲线是: 其中Ni,k(u)递归定义如下:
这里u0,u1,…,un+k,是一个非递减的序列,称为节点,(u0,u1,…,un+k)称为节点向量。定义中可能出现 ,这时约定为0。
例一:选取,n=2,k=1,控制顶点是P0,P1,P2,这样应选择参数节点n+k+1=4个,设节点向量是(u0,u1,u2,u3),按式定义,可写出三个基函数:
由公式可知所定义的B样条曲线是 任意一阶B样条曲线是控制点本身,可以看作是0次多项式
例二.选取n=3,k=2,于是有四个控制顶点P0,P1,P2,P3,应有参数节点n+k+1=6个,设节点向量是(0,0,1,2,3,3),试画出所确定的2阶B样条曲线。 取u=0.5,进行计算。因为0.5∈[0,1]=[u1,u2],因此N1,1(0.5)=1,而其它的Ni,1(0.5)=0,i≠1。
再取u其它一些值进行计算,结果如表所示。 0.5 1 1.5 2 2.5 3 N0,2(u) N1,2(u) N2,2(u) N3,2(u) P(u) P0 0.5(P0+P1) P1 0.5(P1+ P2) P2 0.5(P2+ P3) P3 二阶B样条曲线是连接各控制点的线段组成的折线,是一次多项式
P2,P3的坐标依次是(1,1),(2,3),(4,3), (3,1),这时应取参数节点n+k+1=8个,设选取 例三.选取n=3,k=4,平面上四个控制顶点P0,P1, P2,P3的坐标依次是(1,1),(2,3),(4,3), (3,1),这时应取参数节点n+k+1=8个,设选取 节点向量为(0,0,0,0,1,1,1,1),求所 确定的4阶B样条曲线。 计算N1,4(0.5) ,其中0.5∈[0,1]=[u3,u4]
N3,1(0.5)=1,而对i≠3,Ni,1(0.5)=0。
用类似的过程可计算求出: 曲线上对应参数u=0.5的点是:
证明:四个控制点所确定的四阶B样条曲线( 节点向量为(0,0,0,0,1,1,1,1)) 就是它们所确定的Bezier曲线
二:等距B样条曲线: 参数节点中参数u的每一区间为等长时所得到的B样条函数称为是等距的,或均匀B样条曲线。可假定ui=i,i=0,1,…,n+k,设tj=u-ui+j,ui+j≤u≤ui+j+1与0≤tj≤1是等价的。 递归式,经过计算,可以写出:
如果固定在ui+3≤u≤ui+4区间,可以写出:
令i=0,可写出四个B样条基函数:
设给出n+1个控制点P0,P1,…,Pn, 则所确定的4阶3次等距B样条曲线是:
曲线的性质
性质一:曲线在拚接处是连续的,一阶和二阶导数也是连续的。 因此4阶3次等距B样条曲线:虽然分段定义,但各段拚接处有直到二阶导数的连续性,整条曲线是光滑的。
性质2:4阶3次等距B样条曲线具有凸包性,这通过验证0≤Nj,4(u)≤1,0≤j≤3及 当移动一个控制点时,只对其中的一段曲线有影响,并不对整条曲线产生影响。如图4.22所示是一条B样条曲线。该图表示控制点P5变化后曲线变化的情况。由图可见P5变化只对其中一段曲线有影响。
性质4:用B样条曲线可构造直线段、尖点、切线等特殊情况。 灵活选择控制点的位置和节点ui的重复数,可形成许多特殊情况的B样条曲线
三.B样条曲面 0≤u≤1,0≤w≤1,0≤k≤K,0≤l≤L每一个曲面片Qkl(u,w)由16个控制点确定。