资源描述:
《计算机图形学实验报告3》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、《计算机图形学》实验报告实验七曲线的生成算法一、实验教学目标与基本要求1.掌握曲线生成的基本算法原理;2.能实现曲线的生成;3.掌握课本所介绍的图形算法的原理和实现。二、理论基础实现Bezier曲线和B样条曲线生成算法。1.Bezier曲线生成算法实现(参见教材P304~306):三次Bezier曲线及deCasteljau算法。2.B样条曲线生成算法实现(参见教材P314~316):B样条曲线的分割,节点插入算法(选做)。三.算法设计与分析(1)Bezier曲线生成算法实现一次Bézier曲线根据n次Bézier曲线定义公式,当n=1时,有:当n=2时此式说明二次Berzier曲线
2、对应一条起点在P0,终点在P2处的抛物线,即有P(0)=P0,P(1)=P2,P'(0)=2(P1-P0),P'(1)=2(P2-P1)。三次Bézier曲线当n=3时,有三次Bézier曲线:由此可得三次Berzier的矩阵表达式P(T)=TMz[P0P1P2P3]T=TMzP若令S=1-t,则把三次Berzier曲线P(t)改写成P(t)=((C30SP0+C31tP1)S+C32t2P2+C33t3P3。(2)Bézier曲线的分割递推Casteljau算法抛物线的三切线定理:设P0、P02、P2是一条抛物线上顺序三个不同的点。过P0和P2点的两切线交于P1点,在P02点的切线
3、交P0P1和P2P1于P01和P11,则如下比例成立:Bézier曲线的deCasteljau算法给定空间n+1个点Pi(i=0,1,…,n)及参数t,有:上式中,Pi0=Pi是定义Bezier曲线的控制点,P0n即为曲线P(t)上具有参数t的点。deCasteljau算法稳定可靠,直观简便,可以编出十分简捷的程序,是计算Bezier曲线的基本算法和标准算法。当n=3时,decasteljau算法递推出的Pik呈直角三角形,如图所示。从左向右递推,最右边点P03即为曲线上的点(3).B样条曲线生成算法实现B样条曲线的矩阵表示当k=1时,则有一次B样条曲线的基函数如下:则Pi,1(u)
4、=N1,1(u)Pi+N2,1(u)Pi+1一次B样条曲线是由每相邻两个顶点构造出一段直线段集。取k=2,则有二次B样条曲线的基函数空间相邻的每三个顶点可构造出一段二次B样条曲线,其中第i段可表示成取k=3,则有三次B样条曲线的基函数如下:三次B样条曲线段为:四、程序调试及结果的分析本程序运行环境为VC下的MFC环境。本实验将列出三次Bezier曲线及deCasteljau算法和B样条曲线的源代码。实验代码:(1).三次Bezier曲线源码doubleCQuxianhuafaView::b03(doublet){return(pow(1-t,3));}doubleCQuxianhua
5、faView::b13(doublet){return(3*t*pow(1-t,2));}doubleCQuxianhuafaView::b23(doublet){return(3*(1-t)*t*t);}doubleCQuxianhuafaView::b33(doublet){return(t*t*t);}CPenPenRed(PS_SOLID,1,RGB(255,0,0));CPenPenBlue(PS_SOLID,1,RGB(0,0,255));CPenPenGreen(PS_SOLID,1,RGB(0,255,0));//设置控制点,绘出特征多边形x0=220;y0=10;x
6、1=410;y1=10;x2=225;y2=150;x3=410;y3=100;pDC->SelectObject(PenBlue);//使用蓝色画笔pDC->MoveTo(x0,y0);pDC->LineTo(x1,y1);pDC->LineTo(x2,y2);pDC->LineTo(x3,y3);//绘制Bezier曲线pDC->MoveTo(x0,y0);t=0;dt=0.01;//t从0到1,每步增加0.01,取100个点pDC->SelectObject(PenRed);//使用红色画笔for(i=0;i<=100;i++){curx=(int)(b03(t)*x0+b13
7、(t)*x1+b23(t)*x2+b33(t)*x3);cury=(int)(b03(t)*y0+b13(t)*y1+b23(t)*y2+b33(t)*y3);pDC->LineTo(curx,cury);t=t+dt;}(2)deCasteljau算法源码voidCQuxianhuafaView::bez_to_points(CDC*pDC){POINTpoints;floatt,delt;inti;//voiddecas(int,POINT[],flo