计算机图形学报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

中南大学

计算机图形学

实验报告

学生姓名谭淼

学号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++;

相关文档
最新文档