您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 冶金工业 > 贝齐尔曲线曲面生成方法
实验三贝齐尔(Bezier)曲线曲面的生成方法实验类型:综合型一、目的与任务目的:通过学生上机,了解贝齐尔(Bezier)曲线德卡斯特里奥的递推算法和贝齐尔(Bezier)曲线的几何作图法。任务:熟悉线框建模、表面建模的基本方法。二、内容、要求与安排方式1、实验内容与要求:贝齐尔(Bezier)曲线曲面的德卡斯特里奥的递推算法P(t)=∑Bi,n(t)Q(i)和几何作图法;要求用熟悉的编程语言编制、调试和运行程序,并打印程序清单和输出结果。2、实验安排方式:课外编写好程序清单,按自然班统一安排上机。三、实验步骤1、熟悉贝齐尔(Bezier)的贝齐尔基函数和贝齐尔的性质2、贝齐尔(Bezier)曲线的德卡斯特里奥的递推算法;3、贝齐尔(Bezier)曲线的几何作图法;4、贝齐尔(Bezier)曲线的德卡斯特里奥的递推算法;5、贝齐尔(Bezier)曲线的几何作图法。6、对几何作图法绘制出图,对德卡斯特里奥的递推算法编出程序。四、实验要求1.在规定的时间内完成上机任务。2.必须实验前进行复习和预习实验内容。3.在熟悉命令过程中,注意相似命令在操作中的区别。4.指定图形完成后,需经指导教师认可后,方可关闭计算机。5.完成实验报告一份。五、试验具体内容1,Bezier曲线的描述在空间给定n+1个点P0,P1,P2,⋯,Pn,称下列参数曲线为n次的Bezier曲线。P(t)=6nt=0PiJi,n(t),0≤t≤1其中Ji,n(t)是Bernstein基函数,即Bi,n(t)=n!/i!(n-i)*t(1-t);i=0,⋯⋯,n一般称折线P0P1P2⋯Pn为曲线P(t)的控制多边形;称点P0,P1,P2,⋯,Pn为P(t)的控制顶点。在空间曲线的情况下,曲线P(t)=(x(t),y(t),z(t))和控制顶点Pi=(Xi,Yi,Zi)的关系用分量写出即为:X(t)=6ni=0XiJi,n(t)Y(t)=6ni=0YiJi,n(t)Z(t)=6ni=0ZiJi,n(t)当t在区间[0,1]上变动时,就产生了Bezier曲线。若只考虑x和y,就是平面上的Bezier曲线。以三次Bezier曲线为例,它可用矩阵形式表示如下:P(t)=[t3t2t1]-13-313-630-33001000Q(0)Q(1)Q(2)Q(3)0≤t≤12,Bezier曲线的性质Bezier曲线具有以下性质:当t=0时,P(0)=P0,故P0决定曲线的起点,当t=1时,P(1)=Pn,故Pn决定曲线的终点。Bezier曲线的起点、终点与相应的特征多边形的起点、终点重合。Bezier曲线P(t)在P0点与边P0P1相切,在Pn点与边Pn-1Pn相切。Bezier曲线P(t)位于其控制顶点P0,P1,P2,⋯,Pn的凸包之内。Bezier曲线P(t)具有几何不变性。Bezier曲线P(t)具有变差缩减性。3,Bezier曲线的deCasteljau算法PauldeCasteljau发现了一个Bezier曲线非常有趣的特性,任何的Bezier曲线都能很容易地分成两个同样阶次的Bezier曲线。图1定比分割如图1所示,当P0,P2固定,引入参数t,令P0P10P10P1=P1P11P11P2=P10P20P20P11的比值为t:(1-t),即有:P10=(1-t)P0+tP1P11=(1-t)P1+tP2P20=(1-t)P10+tP11t从0变到1,第一、二式是两条一次Bezier曲线。将一、二式代入第三式得:P20=(1-t)2P0+2t(1-t)P1+t2P2当t从0变到1时,它表示了由P0、P1、P2三个控制顶点形成的一条二次Bezier曲线。并且表明:这个二次Bezier曲线P02可以定义为分别由前两个顶点(P0,P1)和后两个顶点(P1,P2)决定的一次Bezier曲线的线性组合。依次类推,由四个控制点定义的三次Bezier曲线P03可被定义为分别由(P0,P1,P2)和(P1,P2,P3)确定的二条二次Bezier曲线的线性组合,由(n+1)个控制点Pi(i=0,1,⋯,n)定义的n次Bezier曲线P0n可被定义为分别由前、后n个控制点定义的两条(n-1)次Bezier曲线P0n-1与P1n-1的线性组合:Pn0=(1-t)Pn-10+tPn-11t∈[0,1]由此得到Bezier曲线的递推计算公式:Pki=Pik=0(1-t)Pk-1i+tPk-1i+1k=1,2,⋯,n,i=0,1,⋯,n-k这便是deCasteljau算法。用这一递推公式,在给定参数下,求Bezier曲线上一点P(t)非常有效。上式中:Pi0=Pi是定义Bezier曲线的控制点,P0n即为曲线P(t)上具有参数t的点。这一算法可通过简单的几何作图来实现,给定参数t∈[0,1],把定义域分成长度为t:(1-t)的两段。依次对原始控制多边形每一边执行同样的定比分割,所得分点就是第一级递推生成的中间顶点Pi1(i=0,1,⋯,n-1),对这些中间顶点构成的控制多边形再执行同样的定比分割,得第二级中间顶点Pi2(i=0,1,⋯,n-2)。重复进行下去,直到n级递推得到一个中间顶点P0n即为所求曲线上的点P(t)。当t=1/2时,从(2)式可知,求Pik只需进行加法和除2运算,在计算机内除2运算只需右移1位,计算速度快。所以通常取t=1/2最方便,即每次求得Bezier曲线的中点。如图2所示,有0,1,2,3四个控制点,计算每条线的中点01,12,23,再得中点012,123,最后得到的中点0123即在曲线上。四个控制点0,01,012,0123又定义了左边的曲线,四个控制点0123,123,23,3又定义了右边的曲线,重复对左右的两条曲线再进行定比分割,多次进行定比分割后,就可以用直线段代替曲线段[3]。图2deCasteljau算法的几何作图(t=1/2)六、贝齐尔(Bezier)曲线德卡斯特里奥的递推算法程序清单#includestdio.h#includemath.hvoidmain(){inti,j,k,f,u,d,n,m,w,g,h;charc1;i=0;j=1;k=1;w=1;g=1;h=1;f=1;u=1;d=1;printf(pleaseinputnnumber:\n);scanf(%d,&n);for(i=0;i=n;i++){{for(g=1;g=n;g++)f=f*g;for(h=1;h=i;h++)u=u*h;for(w=1;w=(n-i);w++)d=d*w;m=f/u/d;printf(%d,m);f=1;u=1;d=1;}for(j=1;j=i;j++)printf(t);for(k=1;k=(n-i);k++)printf((1-t));printf(Q(%d),i);if(i==n)break;elseprintf(+);}}七、运行结果八,MATLAB曲面生成程序:[th,r]=meshgrid((0:5:360)*pi/180,0:.05:1);%在极坐标系下设置一个73×21的网格矩阵,[X,Y]=pol2cart(th,r);%转化为笛卡儿坐标系%Z=X+i.*Y;F=abs((Z.^4-1).^(1/4));surf(X,Y,F);%显示曲面的立体图形%S=[X(:)Y(:)F(:)];%把X、Y、F3个矩阵中的数据存储到矩阵S中%b=size(S);S=[floor(1:b(1,1));S']';saveflcxq.iblS–ascii图像为:
本文标题:贝齐尔曲线曲面生成方法
链接地址:https://www.777doc.com/doc-5686586 .html