计算机图形学报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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++;