当前位置:文档之家› 计算机图形学报告

计算机图形学报告

中南大学计算机图形学实验报告学生姓名谭淼学号23专业班级应数1102班指导老师刘圣军数学与统计学院2013年12月实验目的:设计并实现一个简单动画(二维或三维)。

熟悉并应用画线的基本算法—Bresenham算法。

实验过程:1、实验步骤:(1)打开Visual Studio 2010,新建一个MFC项目,取名为tuxingxue,设置为单文档。

(2)打开类视图,添加一个名为Cline2D的类,在该类中添加BresenhamLine(CDC* pDC, int xa,float ya,int xb,float yb) DrawPixel(CDC* pDC, int x, float y, unsigned int color, int size);BresenhamLine1(CDC* pDC, int xa,float ya,int xb,float yb);BresenhamLine2(CDC* pDC, int xa,float ya,int xb,float yb); BresenhamLine3(CDC* pDC, int xa,float ya,int xb,float yb); BresenhamLine4(CDC* pDC, int xa,float ya,int xb,float yb); 以上函数的返回值类型均为void型。

在中,分别在其中添加代码实现画线的功能,具体代码见附录中的源代码。

(3)画出基本图形。

在中定义CLine2D 的一个对象为line1,以便调用CLine2D中的函数,此时在调用的函数中赋初始值即可画出最基本的图形,即为一颗大五角星以及三颗小的五角星。

(4)让画出的五角星动起来。

从类视图中CtuxingxueView下添加名为OnTimer的消息处理函数,在中添加bool型变量m_flag,在OnTimer函数下添加代码,具体代码见附录。

在添加变量int m_x1、int m_y1、int m_x2、int m_y2、int m_x3、int m_y3、int m_x4、int m_y4、int m_x5、int m_y5、int m_x6、int m_y6、int m_x7、int m_y7、int m_x8、int m_y8、int m_x9、int m_y9、int m_x10、int m_y10、int m_x11、int m_y11、int m_x12、int m_y12。

在中为这些变量赋初始值,将第三步中函数赋的初值用这些变量代替,这样变量的值可以改变,在资源视图中menu下IDR_MAINFRAME中添加名为绘图的菜单项,在绘图下添加名为运行的选项,其ID号为ID_run,添加事件处理程序,函数处理程序名称为Onrun,将其类选为C tuxingxueView,此时,在Onrun中添加代码,再运行就可以让图形动起来了。

2、实验中遇到的问题及处理方法(1)问题:图形无法显示解决方法:定义CLine2D 的一个对象,调用画图的函数,调用画图的函数就可以显示图形了。

(2)问题:画五角星时线段的斜率不好控制,因为x与y均是int型的解决方法:把BresenhamLine,DrawPixel中的y坐标由int型改为float型,这样就可以得到想要的坐标,画出比较理想的直线以及五角星。

(3)问题:五角星下落之后会从窗口中消失解决办法:消失的原因是y的限定值过大,将y的限定值改小就行了使用方法:运行的界面出现后,点击菜单中的绘图选项,再点击运行,五角星就会从上方慢慢降落了。

该动画比较简单,作用是简洁美观。

运行结果:运动之前:运动之中:运动之后:工程压缩文件:附录(源代码):void CLine2D::BresenhamLine(CDC* pDC, int xa,float ya,int xb,float yb) {int x,y,dx,dy,e,i;dx = xa-xb;dy = ya-yb;e =-dx;x=xa;y=ya;for( i=0; i<=-dx; i++){DrawPixel(pDC,x,y,RGB(0,0,255),1);x++;e=e++;if(e >= 0){y=y-3; }}}void CLine2D::DrawPixel(CDC* pDC, int x, float y, unsigned int color,int size){if( pDC == NULL )return;if( size == 1 ){pDC->SetPixel( x, y, color );}else{size = ( size + 1 ) / 2;CPen newPen( PS_SOLID, 1, color );CPen *oldPen = pDC->SelectObject( &newPen );CBrush newBrush( color );CBrush *oldBrush = pDC->SelectObject( &newBrush );pDC->SelectObject( oldPen );pDC->SelectObject( oldBrush );}}void CLine2D::BresenhamLine1(CDC* pDC, int xa,float ya,int xb,float yb) {int x,y,dx,dy,e,i;dx = xa-xb;dy = ya-yb;e =dx;x=xa;y=ya;for( i=0; i<=dx; i++){DrawPixel(pDC,x,y,RGB(0,0,255),1);x--;e=e++;if(e >= 0){y=y-3; }}}void CLine2D::Draw1(CDC* pDC, int x, int y){BresenhamLine1(pDC, x, y, x-100,y-100);}void CLine2D::BresenhamLine2(CDC* pDC, int xa,float ya,int xb,float yb) {int x,dx,dy,e,i;float y;dx = xa-xb;dy = ya-yb;e =dx;x=xa;y=ya;for( i=0; i<=-dx; i++){DrawPixel(pDC,x,y,RGB(0,0,255),1);x++;e=e--;if(e >= 0){y=y-3; }}}void CLine2D::BresenhamLine3(CDC* pDC, int xa,float ya,int xb,float yb) {int x,dx,dy,e,i;float y;dx = xa-xb;dy = ya-yb;e =-dx;x=xa;y=ya;for( i=0; i<=-dx; i++){DrawPixel(pDC,x,y,RGB(0,0,255),1);x=x++;e=e++;if(e >= 0){y=y+; }}}void CLine2D::BresenhamLine4(CDC* pDC, int xa,float ya,int xb,float yb) {int x,dx,dy,e,i;float y;dx = xa-xb;dy = ya-yb;e =-dx;x=xa;y=ya;for( i=0; i<=-dx; i++){DrawPixel(pDC,x,y,RGB(0,0,255),1); x=x++;e=e++;if(e >= 0){y=; }}}CtuxingxueView::CtuxingxueView(): m_x1(150), m_y1(150), m_x2(250), m_y2(150), m_x3(120), m_y3(60),m_x4(315), m_y4(75), m_x5(365), m_y5(75), m_x6(300), m_y6(30),m_x7(415), m_y7(75), m_x8(465), m_y8(75), m_x9(400), m_y9(30),m_x10(515), m_y10(75), m_x11(565), m_y11(75), m_x12(500), m_y12(30)void CtuxingxueView::OnDraw(CDC* pDC){CtuxingxueDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;CLine2D line1;(pDC,m_x1,m_y1,m_x1+50,m_y1-150);(pDC,m_x2,m_y2,m_x2-50,m_y2-150);(pDC,m_x3,m_y3,m_x3+160,m_y3);(pDC,m_x3,m_y3,m_x3+130,m_y3+90);(pDC,m_x1,m_y1,m_x1+130,m_y1-90);(pDC,m_x4,m_y4,m_x4+25,m_y4-75);(pDC,m_x5,m_y5,m_x5-25,m_y5-75);(pDC,m_x6,m_y6,m_x6+80,m_y6);(pDC,m_x6,m_y6,m_x6+65,m_y6+45);(pDC,m_x4,m_y4,m_x4+65,m_y4-45);(pDC,m_x7,m_y7,m_x7+25,m_y7-75);(pDC,m_x8,m_y8,m_x8-25,m_y8-75);(pDC,m_x9,m_y9,m_x9+80,m_y9);(pDC,m_x9,m_y9,m_x9+65,m_y9+45);(pDC,m_x7,m_y7,m_x7+65,m_y7-45);(pDC,m_x10,m_y10,m_x10+25,m_y10-75);(pDC,m_x11,m_y11,m_x11-25,m_y11-75);(pDC,m_x12,m_y12,m_x12+80,m_y12);(pDC,m_x12,m_y12,m_x12+65,m_y12+45);(pDC,m_x10,m_y10,m_x10+65,m_y10-45);}void CtuxingxueView::OnRun(){m_flag=true;SetTimer(1,100,NULL);}void CtuxingxueView::OnTimer(UINT_PTR nIDEvent) {if(m_flag){if(m_y1<300&&m_y2<300&&m_y3<300){m_y1+=3;m_y2+=3;m_y3+=3;}if(m_y4<300&&m_y5<300&&m_y6<300){m_y4+=3;m_y5+=3;m_y6+=3;}if(m_y7<300&&m_y8<300&&m_y9<300){m_y7+=2;m_y8+=2;m_y9+=2;}if(m_y10<300&&m_y11<300&&m_y12<300) {m_y10+=1;m_y11+=1;m_y12+=1;}else{KillTimer(1);}}Invalidate();CView::OnTimer(nIDEvent);}。

相关主题