计算机图形学报告.docx
- 文档编号:17815331
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:12
- 大小:347.96KB
计算机图形学报告.docx
《计算机图形学报告.docx》由会员分享,可在线阅读,更多相关《计算机图形学报告.docx(12页珍藏版)》请在冰点文库上搜索。
计算机图形学报告
中南大学
计算机图形学
实验报告
学生姓名谭淼
学号1304110723
专业班级应数1102班
指导老师刘圣军
数学与统计学院
2013年12月
实验目的:
设计并实现一个简单动画(二维或三维)。
熟悉并应用画线的基本算法—Bresenham算法。
实验过程:
1、实验步骤:
(1)打开VisualStudio2010,新建一个MFC项目,取名为tuxingxue,设置为单文档。
(2)打开类视图,添加一个名为Cline2D的类,在该类中添加
BresenhamLine(CDC*pDC,intxa,floatya,intxb,floatyb)
DrawPixel(CDC*pDC,intx,floaty,unsignedintcolor,intsize);
BresenhamLine1(CDC*pDC,intxa,floatya,intxb,floatyb);
BresenhamLine2(CDC*pDC,intxa,floatya,intxb,floatyb);
BresenhamLine3(CDC*pDC,intxa,floatya,intxb,floatyb);
BresenhamLine4(CDC*pDC,intxa,floatya,intxb,floatyb);
以上函数的返回值类型均为void型。
在Line.cpp中,分别在其中添加代码实现画线的功能,具体代码见附录中的源代码。
(3)画出基本图形。
在tuxingxueview.cpp中定义CLine2D的一个对象为line1,以便调用CLine2D中的函数,此时在调用的函数中赋初始值即可画出最基本的图形,即为一颗大五角星以及三颗小的五角星。
(4)让画出的五角星动起来。
从类视图中CtuxingxueView下添加名为OnTimer的消息处理函数,在tuxingxueview.h中添加bool型变量m_flag,在OnTimer函数下添加代码,具体代码见附录。
在tuxingxueview.h添加变量intm_x1、intm_y1、intm_x2、intm_y2、intm_x3、intm_y3、intm_x4、intm_y4、intm_x5、intm_y5、intm_x6、intm_y6、intm_x7、intm_y7、intm_x8、intm_y8、intm_x9、intm_y9、intm_x10、intm_y10、
intm_x11、intm_y11、intm_x12、intm_y12。
在tuxingxueview.cpp中为这些变量赋初始值,将第三步中函数赋的初值用这些变量代替,这样变量的值可以改变,在资源视图中menu下IDR_MAINFRAME中添加名为绘图的菜单项,在绘图下添加名为运行的选项,其ID号为ID_run,添加事件处理程序,函数处理程序名称为Onrun,将其类选为CtuxingxueView,此时,在Onrun中添加代码,再运行就可以让图形动起来了。
2、实验中遇到的问题及处理方法
(1)问题:
图形无法显示
解决方法:
定义CLine2D的一个对象,调用画图的函数,
调用画图的函数就可以显示图形了。
(2)问题:
画五角星时线段的斜率不好控制,因为x与y均是int型的
解决方法:
把BresenhamLine,DrawPixel中的y坐标由int型
改为float型,这样就可以得到想要的坐标,画出比较理想的
直线以及五角星。
(3)问题:
五角星下落之后会从窗口中消失
解决办法:
消失的原因是y的限定值过大,将y的限定值改小
就行了
使用方法:
运行的界面出现后,点击菜单中的绘图选项,再点击运行,五角星就会从上方慢慢降落了。
该动画比较简单,作用是简洁美观。
运行结果:
运动之前:
运动之中:
运动之后:
工程压缩文件:
附录(源代码):
voidCLine2D:
:
BresenhamLine(CDC*pDC,intxa,floatya,intxb,floatyb)
{
intx,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;}
}
}
voidCLine2D:
:
DrawPixel(CDC*pDC,intx,floaty,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->SelectObject(oldPen);
pDC->SelectObject(oldBrush);
}
}
voidCLine2D:
:
BresenhamLine1(CDC*pDC,intxa,floatya,intxb,floatyb)
{
intx,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;}
}
}
voidCLine2D:
:
Draw1(CDC*pDC,intx,inty)
{
BresenhamLine1(pDC,x,y,x-100,y-100);
}
voidCLine2D:
:
BresenhamLine2(CDC*pDC,intxa,floatya,intxb,floatyb)
{
intx,dx,dy,e,i;floaty;
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;}
}
}
voidCLine2D:
:
BresenhamLine3(CDC*pDC,intxa,floatya,intxb,floatyb)
{
intx,dx,dy,e,i;floaty;
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+0.7;}
}
}
voidCLine2D:
:
BresenhamLine4(CDC*pDC,intxa,floatya,intxb,floatyb)
{
intx,dx,dy,e,i;floaty;
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-0.69;}
}
}
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)
voidCtuxingxueView:
:
OnDraw(CDC*pDC)
{
CtuxingxueDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
if(!
pDoc)
return;
CLine2Dline1;
line1.BresenhamLine(pDC,m_x1,m_y1,m_x1+50,m_y1-150);
line1.BresenhamLine1(pDC,m_x2,m_y2,m_x2-50,m_y2-150);
line1.BresenhamLine2(pDC,m_x3,m_y3,m_x3+160,m_y3);
line1.BresenhamLine3(pDC,m_x3,m_y3,m_x3+130,m_y3+90);
line1.BresenhamLine4(pDC,m_x1,m_y1,m_x1+130,m_y1-90);
line1.BresenhamLine(pDC,m_x4,m_y4,m_x4+25,m_y4-75);
line1.BresenhamLine1(pDC,m_x5,m_y5,m_x5-25,m_y5-75);
line1.BresenhamLine2(pDC,m_x6,m_y6,m_x6+80,m_y6);
line1.BresenhamLine3(pDC,m_x6,m_y6,m_x6+65,m_y6+45);
line1.BresenhamLine4(pDC,m_x4,m_y4,m_x4+65,m_y4-45);
line1.BresenhamLine(pDC,m_x7,m_y7,m_x7+25,m_y7-75);
line1.BresenhamLine1(pDC,m_x8,m_y8,m_x8-25,m_y8-75);
line1.BresenhamLine2(pDC,m_x9,m_y9,m_x9+80,m_y9);
line1.BresenhamLine3(pDC,m_x9,m_y9,m_x9+65,m_y9+45);
line1.BresenhamLine4(pDC,m_x7,m_y7,m_x7+65,m_y7-45);
line1.BresenhamLine(pDC,m_x10,m_y10,m_x10+25,m_y10-75);
line1.BresenhamLine1(pDC,m_x11,m_y11,m_x11-25,m_y11-75);
line1.BresenhamLine2(pDC,m_x12,m_y12,m_x12+80,m_y12);
line1.BresenhamLine3(pDC,m_x12,m_y12,m_x12+65,m_y12+45);
line1.BresenhamLine4(pDC,m_x10,m_y10,m_x10+65,m_y10-45);
}
voidCtuxingxueView:
:
OnRun()
{
m_flag=true;
SetTimer(1,100,NULL);
}
voidCtuxingxueView:
:
OnTimer(UINT_PTRnIDEvent)
{
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);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 报告
![提示](https://static.bingdoc.com/images/bang_tan.gif)