您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 其它文档 > 计算机图形学基础教程课件
ComputerGraphics第七章自由曲线和曲面(1)7.1基本概念7.2三次参数样条曲线本章内容-1工业产品的几何形状大致可分为两类:一类由初等解析曲面,如平面、圆柱面、圆锥面、球面、圆环面等组成,可以用初等解析函数完全清楚地表达全部形状。另一类由自由曲面组成,如汽车车身、飞机机翼和轮船船体等的曲线和曲面,不能用初等解析函数完全清楚地表达全部形状,需要构造新的函数来进行研究,这些研究成果形成了计算机辅助几何设计(ComputerAidedGeometricDesign,CAGD)学科。图7-1汽车的曲面7.1基本概念7.1.1样条曲线曲面7.1.2曲线曲面的表示形式7.1.3拟合和逼近7.1.4连续性条件7.1.1样条曲线曲面在汽车制造厂里,传统上采用样条绘制曲线的形状。绘图员弯曲样条(如弹性细木条)通过各型值点,其它地方自然过渡,然后沿样条画下曲线,即得到样条曲线(SplineCurve)。在计算机图形学中,样条曲线是指由多项式曲线段连接而成的曲线,在每段的边界处满足特定的连续性条件,而样条曲面则可用两组正交样条曲线来描述。7.1.2曲线曲面的表示形式曲线曲面的可以采用显式方程、隐函数方程和参数方程表示。首先看一下直线的表示形式:已知直线的起点坐标P1(x1,y1)和终点坐标P2(x2,y2),直线的显式方程表示为:)(112121xxxxyyyy直线的隐函数方程表示为:直线的参数方程表示为:0)()(112121xxxxyyyyxftyyyytxxxx)()(121121由于用参数方程表示的曲线曲面可以直接进行几何变换,而且易于表示成矢量和矩阵,所以在计算机图形学中一般使用参数方程来描述曲线曲面。下面以一条三次曲线为例,给出参数方程的矢量和矩阵表示:参数方程表示:323232()()0,1()xxxxyyyyzzzzxtatbtctdytatbtctdtztatbtctd,矢量表示:矩阵表示:32()0,1ptatbtctdt,32()10,1abptttttcd,7.1.3拟合和逼近曲线曲面的拟合:当用一组型值点(插值点)来指定曲线曲面的形状时,形状完全通过给定的型值点序列确定,称为曲线曲面的拟合。图7-2拟合曲线图7-3逼近曲线曲线曲面的逼近:当用一组控制点来指定曲线曲面的形状时,求出的形状不必通过控制点,称为曲线曲面的逼近。7.1.4连续性条件通常单一的曲线段或曲面片难以表达复杂的形状,必须将一些曲线段连接成组合曲线,或将一些曲面片连接成组合曲面,才能描述复杂的形状。为了保证在连接点处平滑过渡,需要满足连续性条件。连续性条件有两种:参数连续性和几何连续性。参数连续性零阶参数连续性,记作C0,指相邻两个曲线段在交点处具有相同的坐标。如图7-4所示。图7-4零阶连续性一阶参数连续性,记作C1,指相邻两个曲线段在交点处具有相同的一阶导数。如图7-5所示。图7-5一阶连续性二阶参数连续性,记作C2,指相邻两个曲线段在交点处具有相同的一阶和二阶导数。如图7-6所示。图7-6二阶连续性几何连续性与参数连续性不同,集合连续性只要求参数导数成比例,而不是相等。零阶几何连续性,记作G0,与零阶参数连续性相同,指相邻两个曲线段在交点处具有相同的坐标。一阶几何连续性,记作G1,指相邻两个曲线段在交点处的一阶导数成比例,但大小不一定相等。二阶几何连续性,记作G2,指相邻两个曲线段在交点处的一阶和二阶导数成比例,即曲率一致。参数连续性和几何连续性的比较:对于几何连续性,曲线将向具有较大切向量的部分弯曲。7.2三次参数样条曲线11(1,2,,)()(1)()(2)()[,](3)[,](1,2,,1)()()iiniiinPinPtPPtPtPPPPinPttPt三次参数样条曲线可表述如下:已知个型值点且相邻型值点不重合,若满足下列条件:型值点在上;在整个区间上二阶连续可导;在每个子区间上,分段函数都是参数的三次多项式,则称函数是过型值点的三次参数样条函数,由三次参数样条函数构成的曲线称为三次参数样条曲线。7.2.1参数样条曲线定义222111[0,]()()()()()()()()iiiiiiiittLLxxyyzzPtxtPtytzt这里,参数是相邻型值点之间的弦长,。这里是矢量,即2312341234223434()=[0,](71)()()=23()=26iiiiiiPtBBtBtBttLBBBBPtPtBBtBtPtBBt第段的三次参数样条曲线的表达式为下面,根据已知条件确定各待定系数、、、对两次求导,有7.2.2系数求解1+1+123+112343+1+1340,(0)==(1):()(2),(0)=2(3),()=26(4)iiiiiiiiiiiiiiiiiiiiitiPPPPBtLiPPPLPBBLBLBLiPMPBiPMPLBBL当时,第段子曲线对应于端点记为:当时,第段子曲线对应于端点,记为设第段曲线在型值点处的二阶导矢量为有设第段曲线在型值点处的二阶导矢量为有11213412312341123141=;()();361/2;()6()=1()=[()()]361()(72)26iiiiiiiiiiiiiiiiiiiiiiiiMMBPBPPLLBMBMMLPtBBtBtBtMMPtPPPLtLMtMMtL联立上述个方程可以解得系数矢量如下:代入得到三次参数样条函数为7.2.3边界条件-1122341112231412111111211111()()(0)()=232()3()=1[()()]236213[()]61()()36iiiiiiiiiiiiiiiiiiiiiiiiiiiiiPtMPLPPtBBtBtBBLBLBMMMPPLLLMMLLMMPPLL利用的一阶导数连续来求解各型值点处的二阶导数矢量。11111111111111111111[()()]361()21()()36,,6-2(73)2,,1;1iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiMMPPLMLLMMLMMPPLLLLLLLLPPPPDLLLLMMMDin令()则有其中,。M连续性方程111211211111111(0),(73)26()/(),(73)26()/nnnnnnnnnnnPPPPPPMMPLLPLPPPMMPLL三次参数样条曲线常用的边界条件有夹持端、自由端和抛物端3种。1夹持端参数样条曲线在始端的一阶导数和终端处的一阶导数。代入的导数有代入的导数有1121112110,0-1,22nnnnnnnMMnMMMMMMDMMD2自由端参数样条曲线在始端和终端的二阶导数为0。3抛物端参数样条曲线的第1段和第段的二阶导数为常数。11211111111111111116()/6()/02,2020,0nnnnnnnnnnnnnnnDDPPDPLLPPDPLLDMDMMMDD边界条件,,夹持端=1,=自由端=0,其中抛物端=-2,1112222333311122222innnnnnnMMDMDMDMDMD各型值点处的二阶导矢量可以用三对角矩阵表示,使用追赶法可以求出唯一解。矩阵表示如下1设置最大型值点数为40.2设置标志变量Flag,当Flag=TURE时开始绘制型值点;当Flag=FALSE时绘制结束。3计算弦长。4根据边界条件计算始端和终端的投影。5对x和y方向进行同样的计算。6分别计算x和y方向的7用追赶法求解三弯矩方程8分别计算x和y方向的系数9根据(x,y)坐标值绘制三次参数样条曲线D,,1234BBBB、、、三次参数样条曲线算法2.已知17个型值点:P1(-360,0),P2(315,71),P3(-270,100),P4(-225,71),P5(-180,0),P6(-135,71),P7(-90,100),P8(-45,71),P9(0,0),P10(45,-71),P11(90,-100),P12(135,-71),P13(180,0),P14(225,71),P15(270,100),P16(315,71),P17(360,0),如图7-27所示。边界条件为:自由端。使用VC++编程绘制通过给定型值点的三次参数样条曲线和正弦曲线,试比较二者之间差异。图7-27型值点CTestView::CTestView(){//TODO:addconstructioncodeherepx[1]=-360;py[1]=0;//型值点初始化px[2]=-315;py[2]=-71;px[3]=-270;py[3]=-100;px[4]=-225;py[4]=-71;px[5]=-180;py[5]=0;px[6]=-135;py[6]=71;px[7]=-90;py[7]=100;px[8]=-45;py[8]=71;px[9]=0;py[9]=0;px[10]=45;py[10]=-71;px[11]=90;py[11]=-100;px[12]=135;py[12]=-71;px[13]=180;py[13]=0;px[14]=225;py[14]=71;px[15]=270;py[15]=100;px[16]=315;py[16]=71;px[17]=360;py[17]=0;}voidCTestView::DrawPoint()//绘制型值点{CClientDCdc(this);CPenNewPen,*OldPen;CBrushNewBrush,*OldBrush;NewPen.CreatePen(PS_SOLID,1,RGB(255,255,0));OldPen=dc.SelectObject(&NewPen);NewBrush.CreateSolidBrush(RGB(0,0,0));OldBrush=dc.SelectObject(&NewBrush);for(inti=1;iN;i++){dc.Ellipse(ROUND(px[i]-5+MaxX/2),ROUND(py[i]-5+MaxY/2),ROUND(px[i]+5+MaxX/2),ROUND(py[i]+5+MaxY/2));//椭圆的4个坐标点}dc.SelectObject(OldPen);NewPen.DeleteObject();dc.SelectObject(OldBrush);NewBrush.DeleteObject();}voidCTestView::ParaSpline()//三次参数样条曲线{……lx[1]=2;ux[1]=mux[1]/lx[1];//追赶法求解x方向三弯矩方程for(i=2;i=n;i++){mx[i]=lmdx[i];lx[i]=2-mx[i]*ux[i-1];ux[i]=mux[i]/lx[i];}Kx[1]=Dx[1]/lx[1];for(i=2;i=n;i++){Kx[i]=(Dx[i]-mx[i]*Kx[i-1])/lx[i];}Mx[n]=Kx[n];for(i=n-1;i=1;i--){Mx[i]=Kx[i]-ux[i]*Mx[i+1];}……}
本文标题:计算机图形学基础教程课件
链接地址:https://www.777doc.com/doc-3681490 .html