您好,欢迎访问三七文档
中南大学《计算机图形学报告》动画设计班级:信科1102姓名:刘群学号:1304110824指导老师:刘圣军数学与统计学院2013年12月一、设计目标:1.目的要求:运用所学的计算机图形学知识、参考老师所给的动画程序,设计一个简单的动画,以达到对书上知识的了解与掌握。其中,在设计过程中不提倡使用OpenGL的自带函数,尽量使用自定义函数,以期对书中的算法有所了解。2.动画描述:该动画为二维动画,主要生成“自行车”的移动:首先在窗口中生成圆和“自行车”,点击“动画”菜单下的“开始”即可使圆一分为二,其中一个先向左再向下运动,另一个先向下再向左运动,使它们在“自行车”前轮处相交,然后“自行车”开始向左运动。该动画在VisualStudio2010软件MFC应用程序下设计完成。动画设计简单,主要自定义两个类“Line”类和“Share”类,以达到对直线生成算法和圆弧生成算法的掌握。二、设计步骤:1.打开VS2010,新建一个MFC应用程序,命名为MyBike,并为其添加“Line”类和“Share”类。(1)在Line.cpp中添加函数BresenhamLine,该函数是Bresenham的改进函数,用以生成直线段,其函数代码见附录。书上生成直线段的Bresenham算法只能用于斜率在0~1之间直线段的生成,而在该改进的Bresenham算法可以生成任意斜率的直线段。使用时直接调用BresenhamLine(pDC,x1,y1,x2,y2,color)即可。(2)在Share.cpp中添加:①添加CSphere(intnRadius)函数,此函数用于设定所画圆的半径,代码如下:CSphere::CSphere(intnRadius){m_nRadius=nRadius;if(m_nRadius1)m_nRadius=1;m_byRed=192;m_byGreen=192;m_byBlue=192;m_nDifPrecision=8;m_nSpePrecision=4;}②添加SetColor(BYTEbyRed,BYTEbyGreen,BYTEbyBlue)函数,此函数用于设定所画圆的颜色,代码如下:voidCSphere::SetColor(BYTEbyRed,BYTEbyGreen,BYTEbyBlue){m_byRed=byRed;m_byGreen=byGreen;m_byBlue=byBlue;}③添加DrawPixel(CDC*pDC,intx,inty,unsignedintcolor,intsize)函数,此函数用于绘制像素点,设置像素点颜色,重新设置所画圆的曲线的宽度,其代码如下:voidCSphere::DrawPixel(CDC*pDC,intx,inty,unsignedintcolor,intsize){if(pDC==NULL)return;if(size==1){pDC-SetPixel(x,y,color);}else{size=(size+1)/2;CPennewPen(PS_SOLID,1,color);CPen*oldPen=pDC-SelectObject(&newPen);CBrushnewBrush(color);CBrush*oldBrush=pDC-SelectObject(&newBrush);pDC-Ellipse(x-size,y-size,x+size,y+size);pDC-SelectObject(oldPen);pDC-SelectObject(oldBrush);}}④添加Draw(CDC*pDC,intx,inty)函数,此函数用于画圆。代码如下:voidCSphere::Draw(CDC*pDC,intx,inty){MidPointCircle(pDC,x,y,m_nRadius,RGB(m_byRed,m_byGreen,m_byBlue));}⑤添加Circlepoints(CDC*pDC,intx,inty,intx0,inty0,intcolor)函数,此函数是由于圆的八对称性而生成,其代码如下:voidCSphere::Circlepoints(CDC*pDC,intx,inty,intx0,inty0,intcolor){DrawPixel(pDC,x+x0,y+y0,color,3);DrawPixel(pDC,y+x0,x+y0,color,3);DrawPixel(pDC,-y+x0,x+y0,color,3);DrawPixel(pDC,-x+x0,y+y0,color,3);DrawPixel(pDC,y+x0,-x+y0,color,3);DrawPixel(pDC,x+x0,-y+y0,color,3);DrawPixel(pDC,-x+x0,-y+y0,color,3);DrawPixel(pDC,-y+x0,-x+y0,color,3);}⑥添加MidPointCircle(CDC*pDC,intx0,inty0,intradius,intcolor)函数,此函数用于生成圆弧,为生成圆弧的中点算法,其代码如下:voidCSphere::MidPointCircle(CDC*pDC,intx0,inty0,intradius,intcolor){intx,y,d,deltaE,deltaSE;x=0;y=radius;d=5-4*radius;deltaE=12;deltaSE=20-8*radius;Circlepoints(pDC,x,y,x0,y0,color);while(yx){if(d=0){d+=deltaE;deltaSE+=8;}else{d+=deltaSE;deltaSE+=16;y--;}deltaE+=8;x++;Circlepoints(pDC,x,y,x0,y0,color);}}添加以上代码到Share.cpp中后,在Share的头文件中进行相应的变量的声明。2.在MyBikeView.cpp中添加相应的函数,已能够输出圆和相应的直线段,从而生成简易的“自行车”模型。①添加DrawSphere(CDC*pDC,intx0,inty0)函数,此函数调用“Sphere”类中的Draw(pDC,x0,y0)函数,以能够绘制出符合要求的圆形,代码如下:voidCMyBikeView::DrawSphere(CDC*pDC,intx0,inty0){CSpherevs(10);vs.SetColor(0,255,0);vs.Draw(pDC,x0,y0);}②DrawBike(CDC*pDC,intx1,inty1)函数,此函数调用DrawSphere(CDC*pDC,intx0,inty0)函数和“Line”类中的BresenhamLine(pDC,x1,y1,x2,y2,color)函数,用于绘制简易“自行车”模型,其代码如下:voidCMyBikeView::DrawBike(CDC*pDC,intx1,inty1){intx2,x3,x4,x5,x6,y2,y3,y4,y5,y6;x2=x1-100;y2=y1;x3=x1-100;y3=y1-60;x4=x1;y4=y1-100;x5=x1-20;y5=y1-90;x6=x1-15;y6=y1-115;CLinevc;vc.BresenhamLine(pDC,x1,y1,x2,y2,RGB(255,0,0));vc.BresenhamLine(pDC,x1,y1,x3,y3,RGB(255,0,0));vc.BresenhamLine(pDC,x1,y1,x4,y4,RGB(255,0,0));vc.BresenhamLine(pDC,x4,y4,x5,y5,RGB(255,0,0));vc.BresenhamLine(pDC,x4,y4,x6,y6,RGB(255,0,0));DrawSphere(pDC,x1,y1);DrawSphere(pDC,x2,y2);}3.在资源视图的“Menu”子菜单选项下找到“IDR_MAINFRAME”选项,单击打开,向其中添加“动画”菜单及其子菜单“开始”和“停止”将“开始”和“停止”子菜单的ID分别改为“STAR”和“END”,并添加事件处理程序。然后在MyBikeView.cpp中相应的函数处添加代码,添加结果如下:voidCMyBikeView::OnStar(){//TODO:在此添加命令处理程序代码SetTimer(1,50,NULL);}SetTimer函数用于创建或设置一个定时器,该函数创建的定时器与Timer控件(定时器控件)效果相同。当使用SetTimer函数的时候,就会生成一个定时器,函数中nIDEvent指的是定时器的标识,也就是名字。nElapse指的是时间间隔,也就是每隔多长时间触发一次事件。第三个参数是一个回调函数,在这个函数里,放入你想要做的事情的代码,你可以将它设定为NULL,也就是使用系统默认的回调函数,系统默认的是OnTimer函数。voidCMyBikeView::OnEnd(){//TODO:在此添加命令处理程序代码KillTimer(1);}KillTimer:移除定时器函数的声明:移除先前用SetTimer设置的定时器。在定时器使用完毕后移除定时器时使用。4.在类视图的CMyBikeView的属性中添加OnTimer(UINT_PTRnIDEvent)函数,其代码如下:voidCMyBikeView::OnTimer(UINT_PTRnIDEvent){//TODO:在此添加消息处理程序代码和或调用默认值if(s1300){s1+=10;}elseif(t1300){s1=300;t1+=10;}if(t2300){t2+=10;}elseif(s2300){t2=300;s2+=10;}if(s1=300&&s2=300){s+=10;}Invalidate(TRUE);CView::OnTimer(nIDEvent);}Settimer是设置定时器的,Ontimer是响应Settimer消息的。当Settimer设置的时间到了,就会自动调动Ontimer()函数。添加以上代码到MyBikeView.cpp中后,在MyBikeView的头文件中进行相应的变量的声明。5.在MyBikeView.cpp中的OnDraw(CDC*pDC)函数中添加代码以能够的得到动画。其代码如下:voidCMyBikeView::OnDraw(CDC*pDC){CMyBikeDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);if(!pDoc)return;DrawSphere(pDC,s1,t1);DrawSphere(pDC,s2,t2);DrawBike(pDC,s,300);//TODO:在此处为本机数据添加绘制代码}OnDraw(CDC*pDC)函数对应用程序窗口的客户区进行绘图的所有代码都必须写在这个函数中。三、生成结果:1.初始运行结果:2.单击“动画”---“开始”的运行结果:(1)两个圆运动结果:(2)“自行车”运动结果:四、参考文献:《计算机图形学》倪明田著北京大学出版社《计算机图形学试验及课程设计VC++版》孔令德著清华大学出版社《VisualC++2010入门经典》苏正泉译清华大学出版社注:“Line”类文件生成由个人设计完成,部分内容参考网络;“Share”类文件生成参照老师所发的实例经个人少量修改完成;“MyBikeView”文件生成由个人设计完成,部分内容参考网络。五、附录:BresenhamLine函数代码:(此部分代码生成是在参考网络情况下经个人修改完成)voidCLine::BresenhamLine(CDC*pDC,intx1,inty1,intx2,inty2,intcolor){if(x1x2){inttemp;temp=x2;x2=x1;x1=temp;}if(y1y
本文标题:动画设计报告
链接地址:https://www.777doc.com/doc-2627821 .html