计算机图形学实验报告.docx
《计算机图形学实验报告.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
计算机图形学实验报告
中南大学信息科学与工程学院
实验报告
实验名称
实验地点科技楼四楼
实验日期2014年6月
指导教师
学生班级
学生姓名
学生学号
提交日期2014年6月
实验一Window图形编程基础
1、实验类型:
验证型实验
2、实验目的
1、熟练使用实验主要开发平台;
2、掌握如何在编译平台下编辑、编译、连接和运行一个简单的Windows图形应用程序;
3、掌握Window图形编程的基本方法;
4、学会使用基本绘图函数和WindowGDI对象;
3、实验内容
创建基于MFC的SingleDocument应用程序(Win32应用程序也可,同学们可根据自己的喜好决定),程序可以实现以下要求:
1、用户可以通过菜单选择绘图颜色;
2、用户点击菜单选择绘图形状时,能在视图中绘制指定形状的图形;
4、实验要求与指导
1、建立名为“颜色”的菜单,该菜单下有四个菜单项:
红、绿、蓝、黄。
用户通过点击不同的菜单项,可以选择不同的颜色进行绘图。
2、建立名为“绘图”的菜单,该菜单下有三个菜单项:
直线、曲线、矩形
其中“曲线”项有级联菜单,包括:
圆、椭圆。
3、用户通过点击“绘图”中不同的菜单项,弹出对话框,让用户输入绘图位置,在指定位置进行绘图。
5、实验结果:
六、实验主要代码
1、画直线:
CClientDC*m_pDC;再在OnDraw函数里给变量初始化
m_pDC=newCClientDC(this);
在OnDraw函数中添加:
m_pDC->MoveTo(10,10);
m_pDC->LineTo(100,100);
m_pDC->SetPixel(100,200,RGB(0,0,0));
m_pDC->TextOut(100,100);
2、画圆:
voidCMyCG:
:
LineDDA2(intxa,intya,intxb,intyb,CDC*pDC)
{
intdx=xb-xa;
intdy=yb-ya;
intSteps,k;
floatxIncrement,yIncrement;
floatx=xa,y=ya;
if(abs(dx)>abs(dy))
Steps=abs(dx);
else
Steps=abs(dy);
xIncrement=dx/(float)Steps;
yIncrement=dy/(float)Steps;
pDC->SetPixel(ROUND(x),ROUND(y),RGB(0,0,0));
for(k=0;k{x+=xIncrement;y+=yIncrement;sleep(10);pDC->SetPixel(ROUND(x),ROUND(y),RGB(0,0,0));}3、画矩形voidCRectangleDlg::OnLButtonDown(UINTnFlags,CPointpoint){lButtonDownNotUp=TRUE;RECTrect;m_showRectangle.GetClientRect(&rect);if((point.xrect.left)&&(point.yrect.top)){regionLeftTopTemp=point;}CDialog::OnLButtonDown(nFlags,point);}voidCRectangleDlg::OnMouseMove(UINTnFlags,CPointpoint){RECTrect;m_showRectangle.GetClientRect(&rect);if((<)&&(>)&&(<)&&(>)){if((lButtonDownNotUp==TRUE){regionRightBottomTemp=point;CDC*pDC=m_showRectangle.GetWindowDC();pDC->Rectangle(CRect(regionLeftTopTemp,regionRightBottomTemp));}}CDialog::OnMouseMove(nFlags,point);}voidCRectangleDlg::OnLButtonUp(UINTnFlags,CPointpoint){lButtonDownNotUp=FALSE;CDialog::OnLButtonUp(nFlags,point);}实验二基本图形生成算法一、实验类型:验证型实验二、实验目的1、掌握DDA、Bresenham直线生成算法;2、掌握Bresenham或中点圆生成算法;3、掌握Bresenham或中点椭圆生成算法;三、实验内容1、实现DDA、Bresenham直线生成算法;2、实现Bresenham画圆法或中点画圆法;3、实现Bresenham或中点法椭圆生成算法;4、利用1、2、3实现的直线、圆、椭圆图形生成函数进行图形绘制;四、实验要求与指导1、按照实验指导书节创建一个基于MFC的SingleDocument应用程序。建立名为“图形绘制”的菜单,该菜单的子菜单项可根据下图进行设定,用户通过点击不同的子菜单项,可以选择不同的算法进行绘图。2、建立一个专门用于进行图形绘制的类,比如下图所示的CMyGL类。如无特殊说明,今后都以该类作为演示。3、所有图形的绘制算法都必须封装在CMyGL类中,如下图。4、在View类中实例化一个CMyGL类的对象,比如m_gl,进行绘图操作。如下图所示:5、用户通过点击“图形绘制”中不同的菜单项,在指定位置进行绘图。5、实验结果:六、实验主要代码1、画直线:voidCDraw::DDALine(CDC*pDC,intx1,inty1,intx2,inty2,COLORREFcolor){doubledx,dy,e,x,y;dx=x2-x1;dy=y2-y1;e=(fabs(dx)>fabs(dy))?fabs(dx):fabs(dy);dx/=e;dy/=e;x=x1;y=y1;for(inti=1;i<=e;i++){pDC->SetPixel((int)(x+,(int)(y+,color);x+=dx;y+=dy;}}2、画圆:voidCMyCG::LineDDA2(intxa,intya,intxb,intyb,CDC*pDC){intdx=xb-xa;intdy=yb-ya;intSteps,k;floatxIncrement,yIncrement;floatx=xa,y=ya;if(abs(dx)>abs(dy))Steps=abs(dx);elseSteps=abs(dy);xIncrement=dx/(float)Steps;yIncrement=dy/(float)Steps;pDC->SetPixel(ROUND(x),ROUND(y),RGB(255,0,0));for(k=0;k{x+=xIncrement;y+=yIncrement;sleep(10);pDC->SetPixel(ROUND(x),ROUND(y),RGB(255,0,0));}3、画椭圆voidCDraw::BresenhamEllipse(CDC*pDC,intx0,inty0,inta,intb,COLORREFcolor){intx,y,p;intaa=a*a,bb=b*b;x=0;y=b;p=2*bb+aa*(1-2*b);while(bb*x<=aa*y){pDC->SetPixel(x+x0,y+y0,color);pDC->SetPixel(-x+x0,y+y0,color);pDC->SetPixel(x+x0,-y+y0,color);pDC->SetPixel(-x+x0,-y+y0,color);if(p>=0){p+=4*aa*(1-y)+bb*(4*x+6);y--;}else{p+=bb*(4*x+6);}x++;}x=a;y=0;p=2*aa+bb*(1-2*a);while(bb*x>aa*y){pDC->SetPixel(x+x0,y+y0,color);pDC->SetPixel(-x+x0,y+y0,color);pDC->SetPixel(x+x0,-y+y0,color);pDC->SetPixel(-x+x0,-y+y0,color);if(p>=0){p+=4*bb*(1-x)+aa*(4*y+6);x--;}else{p+=aa*(4*y+6);}y++;}}实验三、OpenGL图形程序设计基础一.实验目的1)了解OpenGL图形库的功能和结构;2)学习使用VisualC++开发基于控制台的图形程序;3)学习使用VisualC++开发基于单文档(GUI界面)的图形程序。4)学习使用OpenGL生成基本图形;5)学习使用OpenGL实现图形变换;二.实验内容1)使用VisualC++建立一个Win32ConsoleApplication(控制台应用程序),定义若干点坐标,绘制点、线段、不闭合折线、闭合折线、多边形、三角形、四边形、三角扇、三角条带、四边形条带。尝试不同尺寸的点、不同线宽的线、设置颜色等操作。2)使用MFCAppWizard建立一个SDI程序,根据参考资料2和3中的步骤设置OpenGL图形绘制环境。增加绘制4种基本图形(选择其中之一)。3.实验过程:1)建立一个控制台应用程序,在RenderScene()函数中调用不同的系统函数分别绘制不同属性的点、线、折线、多边形、扇形等;2)建立一个SDI程序,按照所给资料设置OpenGL图形绘制环境,并照敲老师所给实列,观看结果,查看关键代码区;3)仿照所给列子,改写代码,绘制彩色的正方体;三.实验结果基本图形显示正确基本图形截图:三棱柱截图: 实验四、二维图形变换程序设计一.实验目的:1)掌握图形变换实现原理,基本几何变换,复合变换等;2)学习使用VisualC++开发菜单,对话框等交互界面的设计;3)学习使用MFC单文档程序,实现二维图形的基本几何变换。二.实验内容:使用VisualC++建立一个单文档程序,采用实验二中定义的基本图形类。在程序中增加图形变换菜单(各基本变换对应菜单项),各图形变换的参数通过对话框提供(设计提供变换参数的对话框,如平移,旋转,比例等),实现二维图形的变换。(提示:在各个图形类中增加相应的成员函数实现平移;菜单选择变换弹出对应变换的参数对话框,对话框中提供参数后取出参数传递给图形对象,通过调用图形变换成员函数实现图形对象的变换)。要求实现直线段、圆、多边形等基本图形的几何变换。三.实验过程:(1).根据实验要求,新建菜单,增加二维图形变换子菜单,然后在菜单上添加平移,比例,对称,旋转以及错切选项。(2).对菜单中的每一项方法构造响应函数,并给几个需要弹出对话框的选项添加对话框响应函数。(3).在弹出的对话框输入参数,获取输入的参数,调用相应的变换函数,实现图形的变换。四.实验结果:结果正确。平移xy(100,0)五、实验主要代码classCTransform//二维几何变换{public:CTransform();virtual~CTransform();voidSetMat(CP2*,int);voidIdentity();voidTranslate(double,double);//平移变换矩阵voidScale(double,double);//比例变换矩阵voidScale(double,double,CP2);//相对于任意点的比例变换矩阵voidRotate(double);//旋转变换矩阵voidRotate(double,CP2);//相对于任意点的旋转变换矩阵voidReflectOrg();//原点反射变换矩阵voidReflectX();//X轴反射变换矩阵voidReflectY();//Y轴反射变换矩阵voidShear(double,double);//错切变换矩阵voidMultiMatrix();//矩阵相乘public:doubleT[3][3];CP2*POld;intnum;};voidCTransform::Translate(doubletx,doublety)//平移变换矩阵{Identity();T[2][0]=tx;T[2][1]=ty;MultiMatrix();}voidCTransform::Scale(doublesx,doublesy)//比例变换矩阵{Identity();T[0][0]=sx;T[1][1]=sy;MultiMatrix();}voidCTransform::Scale(doublesx,doublesy,CP2p)//相对于任意点的整体比例变换矩阵{Translate,;Scale(sx,sy);Translate,;}voidCTransform::Rotate(doublebeta)//旋转变换矩阵{Identity();doublerad=beta*PI/180;T[0][0]=cos(rad);T[0][1]=sin(rad);T[1][0]=-sin(rad);T[1][1]=cos(rad);MultiMatrix();} 实验五、二维交互式图形程序设计一、实验目的:1)综合使用VC++编写Win32应用的方法(单文档、多文档、对话框);2)掌握交互式绘图程序设计及MFC相关类的使用;3)掌握使用MFC的编写简单动画程序。二、实验任务:1)使用MFCAppWizard建立一个SDI程序。综合前几次二维绘图实验的结果,实现基本功能:建立绘制点、直线段、圆、椭圆、圆弧、多段线(折线)、多边形、贝塞尔(Bezier)曲线的相关类(对于封闭图形,应能多种方式填充)、字符串。使用实验二中自定义的CClientDC的派生类,实现交互式(鼠标)绘制以上图形。实现颜色、线型、字体等的交互式选择,实现除曲线、圆弧外其他图形的鼠标拾取(框选、点选)。实现新建文件、保存文件,打开文件(打开保存的自定义图形文件,并绘制图形)。软件界面设计(工具栏、菜单、光标等)。可选扩展功能:(1)实现平移、旋转、缩放、对称、错切等图形几何变换(2)图形的显示控制包括缩放(按比例、选取框)、平移(上、小、左、右)。(3)实现图层功能(可见性、颜色、锁定等)、图块功能(及选中多个图形形成一组,图块的生成、引用、编辑)。(4)图形的显示控制包括实时缩放、实时平移和定点平移等。(5)图形的编辑控制包括撤销、重复、剪切、复制、粘贴、删除、清除。2)本任务是在以上程序的基础上,增加动画功能(可单独增加相应菜单):交互式绘制三个圆作为太阳、地球、月球(要求填充,注意位置。数据放入文档类,即文档类有变量太阳、地球、月球等),实现二维动画:月球绕地球转、地球自转(地球采用图案填充)、地球绕太阳公转(按时间比例,可设置参数:时间、颜色、调整大小)。三、实验过程:1)建立绘制点、直线段、圆、椭圆、圆弧、多段线(折线)、多边形、贝塞尔(Bezier)曲线的相关类2)在菜单栏上增加相应的菜单,用来选择不同的功能3)对增加的菜单栏设置ID,并且在View类中添加相应的事件响应函数,在各自的响应函数中实现各自的功能四、实验结果:基本功能:扩展功能(做一个简单的太阳系):在附加功能中,点击“开始”图形开始变换,点击“停止”图形静止。
x+=xIncrement;
y+=yIncrement;
sleep(10);
}
3、画矩形
voidCRectangleDlg:
OnLButtonDown(UINTnFlags,CPointpoint)
lButtonDownNotUp=TRUE;
RECTrect;
m_showRectangle.GetClientRect(&rect);
if((point.xrect.left)&&(point.yrect.top))
regionLeftTopTemp=point;
CDialog:
OnLButtonDown(nFlags,point);
OnMouseMove(UINTnFlags,CPointpoint)
if((<)&&(>)&&(<)&&(>))
if((lButtonDownNotUp==TRUE)
regionRightBottomTemp=point;
CDC*pDC=m_showRectangle.GetWindowDC();
pDC->Rectangle(CRect(regionLeftTopTemp,regionRightBottomTemp));
OnMouseMove(nFlags,point);
OnLButtonUp(UINTnFlags,CPointpoint)
lButtonDownNotUp=FALSE;
OnLButtonUp(nFlags,point);
实验二基本图形生成算法
一、实验类型:
二、实验目的
1、掌握DDA、Bresenham直线生成算法;
2、掌握Bresenham或中点圆生成算法;
3、掌握Bresenham或中点椭圆生成算法;
三、实验内容
1、实现DDA、Bresenham直线生成算法;
2、实现Bresenham画圆法或中点画圆法;
3、实现Bresenham或中点法椭圆生成算法;
4、利用1、2、3实现的直线、圆、椭圆图形生成函数进行图形绘制;
四、实验要求与指导
1、按照实验指导书节创建一个基于MFC的SingleDocument应用程序。
建立名为“图形绘制”的菜单,该菜单的子菜单项可根据下图进行设定,用户通过点击不同的子菜单项,可以选择不同的算法进行绘图。
2、建立一个专门用于进行图形绘制的类,比如下图所示的CMyGL类。
如无特殊说明,今后都以该类作为演示。
3、所有图形的绘制算法都必须封装在CMyGL类中,如下图。
4、在View类中实例化一个CMyGL类的对象,比如m_gl,进行绘图操作。
如下图所示:
5、用户通过点击“图形绘制”中不同的菜单项,在指定位置进行绘图。
voidCDraw:
DDALine(CDC*pDC,intx1,inty1,intx2,inty2,COLORREFcolor)
doubledx,dy,e,x,y;
dx=x2-x1;
dy=y2-y1;
e=(fabs(dx)>fabs(dy))?
fabs(dx):
fabs(dy);
dx/=e;
dy/=e;
x=x1;
y=y1;
for(inti=1;i<=e;i++)
pDC->SetPixel((int)(x+,(int)(y+,color);
x+=dx;
y+=dy;
pDC->SetPixel(ROUND(x),ROUND(y),RGB(255,0,0));
for(k=0;k{x+=xIncrement;y+=yIncrement;sleep(10);pDC->SetPixel(ROUND(x),ROUND(y),RGB(255,0,0));}3、画椭圆voidCDraw::BresenhamEllipse(CDC*pDC,intx0,inty0,inta,intb,COLORREFcolor){intx,y,p;intaa=a*a,bb=b*b;x=0;y=b;p=2*bb+aa*(1-2*b);while(bb*x<=aa*y){pDC->SetPixel(x+x0,y+y0,color);pDC->SetPixel(-x+x0,y+y0,color);pDC->SetPixel(x+x0,-y+y0,color);pDC->SetPixel(-x+x0,-y+y0,color);if(p>=0){p+=4*aa*(1-y)+bb*(4*x+6);y--;}else{p+=bb*(4*x+6);}x++;}x=a;y=0;p=2*aa+bb*(1-2*a);while(bb*x>aa*y){pDC->SetPixel(x+x0,y+y0,color);pDC->SetPixel(-x+x0,y+y0,color);pDC->SetPixel(x+x0,-y+y0,color);pDC->SetPixel(-x+x0,-y+y0,color);if(p>=0){p+=4*bb*(1-x)+aa*(4*y+6);x--;}else{p+=aa*(4*y+6);}y++;}}实验三、OpenGL图形程序设计基础一.实验目的1)了解OpenGL图形库的功能和结构;2)学习使用VisualC++开发基于控制台的图形程序;3)学习使用VisualC++开发基于单文档(GUI界面)的图形程序。4)学习使用OpenGL生成基本图形;5)学习使用OpenGL实现图形变换;二.实验内容1)使用VisualC++建立一个Win32ConsoleApplication(控制台应用程序),定义若干点坐标,绘制点、线段、不闭合折线、闭合折线、多边形、三角形、四边形、三角扇、三角条带、四边形条带。尝试不同尺寸的点、不同线宽的线、设置颜色等操作。2)使用MFCAppWizard建立一个SDI程序,根据参考资料2和3中的步骤设置OpenGL图形绘制环境。增加绘制4种基本图形(选择其中之一)。3.实验过程:1)建立一个控制台应用程序,在RenderScene()函数中调用不同的系统函数分别绘制不同属性的点、线、折线、多边形、扇形等;2)建立一个SDI程序,按照所给资料设置OpenGL图形绘制环境,并照敲老师所给实列,观看结果,查看关键代码区;3)仿照所给列子,改写代码,绘制彩色的正方体;三.实验结果基本图形显示正确基本图形截图:三棱柱截图: 实验四、二维图形变换程序设计一.实验目的:1)掌握图形变换实现原理,基本几何变换,复合变换等;2)学习使用VisualC++开发菜单,对话框等交互界面的设计;3)学习使用MFC单文档程序,实现二维图形的基本几何变换。二.实验内容:使用VisualC++建立一个单文档程序,采用实验二中定义的基本图形类。在程序中增加图形变换菜单(各基本变换对应菜单项),各图形变换的参数通过对话框提供(设计提供变换参数的对话框,如平移,旋转,比例等),实现二维图形的变换。(提示:在各个图形类中增加相应的成员函数实现平移;菜单选择变换弹出对应变换的参数对话框,对话框中提供参数后取出参数传递给图形对象,通过调用图形变换成员函数实现图形对象的变换)。要求实现直线段、圆、多边形等基本图形的几何变换。三.实验过程:(1).根据实验要求,新建菜单,增加二维图形变换子菜单,然后在菜单上添加平移,比例,对称,旋转以及错切选项。(2).对菜单中的每一项方法构造响应函数,并给几个需要弹出对话框的选项添加对话框响应函数。(3).在弹出的对话框输入参数,获取输入的参数,调用相应的变换函数,实现图形的变换。四.实验结果:结果正确。平移xy(100,0)五、实验主要代码classCTransform//二维几何变换{public:CTransform();virtual~CTransform();voidSetMat(CP2*,int);voidIdentity();voidTranslate(double,double);//平移变换矩阵voidScale(double,double);//比例变换矩阵voidScale(double,double,CP2);//相对于任意点的比例变换矩阵voidRotate(double);//旋转变换矩阵voidRotate(double,CP2);//相对于任意点的旋转变换矩阵voidReflectOrg();//原点反射变换矩阵voidReflectX();//X轴反射变换矩阵voidReflectY();//Y轴反射变换矩阵voidShear(double,double);//错切变换矩阵voidMultiMatrix();//矩阵相乘public:doubleT[3][3];CP2*POld;intnum;};voidCTransform::Translate(doubletx,doublety)//平移变换矩阵{Identity();T[2][0]=tx;T[2][1]=ty;MultiMatrix();}voidCTransform::Scale(doublesx,doublesy)//比例变换矩阵{Identity();T[0][0]=sx;T[1][1]=sy;MultiMatrix();}voidCTransform::Scale(doublesx,doublesy,CP2p)//相对于任意点的整体比例变换矩阵{Translate,;Scale(sx,sy);Translate,;}voidCTransform::Rotate(doublebeta)//旋转变换矩阵{Identity();doublerad=beta*PI/180;T[0][0]=cos(rad);T[0][1]=sin(rad);T[1][0]=-sin(rad);T[1][1]=cos(rad);MultiMatrix();} 实验五、二维交互式图形程序设计一、实验目的:1)综合使用VC++编写Win32应用的方法(单文档、多文档、对话框);2)掌握交互式绘图程序设计及MFC相关类的使用;3)掌握使用MFC的编写简单动画程序。二、实验任务:1)使用MFCAppWizard建立一个SDI程序。综合前几次二维绘图实验的结果,实现基本功能:建立绘制点、直线段、圆、椭圆、圆弧、多段线(折线)、多边形、贝塞尔(Bezier)曲线的相关类(对于封闭图形,应能多种方式填充)、字符串。使用实验二中自定义的CClientDC的派生类,实现交互式(鼠标)绘制以上图形。实现颜色、线型、字体等的交互式选择,实现除曲线、圆弧外其他图形的鼠标拾取(框选、点选)。实现新建文件、保存文件,打开文件(打开保存的自定义图形文件,并绘制图形)。软件界面设计(工具栏、菜单、光标等)。可选扩展功能:(1)实现平移、旋转、缩放、对称、错切等图形几何变换(2)图形的显示控制包括缩放(按比例、选取框)、平移(上、小、左、右)。(3)实现图层功能(可见性、颜色、锁定等)、图块功能(及选中多个图形形成一组,图块的生成、引用、编辑)。(4)图形的显示控制包括实时缩放、实时平移和定点平移等。(5)图形的编辑控制包括撤销、重复、剪切、复制、粘贴、删除、清除。2)本任务是在以上程序的基础上,增加动画功能(可单独增加相应菜单):交互式绘制三个圆作为太阳、地球、月球(要求填充,注意位置。数据放入文档类,即文档类有变量太阳、地球、月球等),实现二维动画:月球绕地球转、地球自转(地球采用图案填充)、地球绕太阳公转(按时间比例,可设置参数:时间、颜色、调整大小)。三、实验过程:1)建立绘制点、直线段、圆、椭圆、圆弧、多段线(折线)、多边形、贝塞尔(Bezier)曲线的相关类2)在菜单栏上增加相应的菜单,用来选择不同的功能3)对增加的菜单栏设置ID,并且在View类中添加相应的事件响应函数,在各自的响应函数中实现各自的功能四、实验结果:基本功能:扩展功能(做一个简单的太阳系):在附加功能中,点击“开始”图形开始变换,点击“停止”图形静止。
3、画椭圆
BresenhamEllipse(CDC*pDC,intx0,inty0,inta,intb,COLORREFcolor)
intx,y,p;
intaa=a*a,bb=b*b;
x=0;y=b;p=2*bb+aa*(1-2*b);
while(bb*x<=aa*y)
pDC->SetPixel(x+x0,y+y0,color);
pDC->SetPixel(-x+x0,y+y0,color);
pDC->SetPixel(x+x0,-y+y0,color);
pDC->SetPixel(-x+x0,-y+y0,color);
if(p>=0)
p+=4*aa*(1-y)+bb*(4*x+6);
y--;
p+=bb*(4*x+6);
x++;
x=a;y=0;p=2*aa+bb*(1-2*a);
while(bb*x>aa*y)
p+=4*bb*(1-x)+aa*(4*y+6);
x--;
p+=aa*(4*y+6);
y++;
实验三、OpenGL图形程序设计基础
一.实验目的
1)了解OpenGL图形库的功能和结构;
2)学习使用VisualC++开发基于控制台的图形程序;
3)学习使用VisualC++开发基于单文档(GUI界面)的图形程序。
4)学习使用OpenGL生成基本图形;
5)学习使用OpenGL实现图形变换;
二.实验内容
1)使用VisualC++建立一个Win32ConsoleApplication(控制台应用程序),定义若干点坐标,绘制点、线段、不闭合折线、闭合折线、多边形、三角形、四边形、三角扇、三角条带、四边形条带。
尝试不同尺寸的点、不同线宽的线、设置颜色等操作。
2)使用MFCAppWizard建立一个SDI程序,根据参考资料2和3中的步骤设置OpenGL图形绘制环境。
增加绘制4种基本图形(选择其中之一)。
3.实验过程:
1)建立一个控制台应用程序,在RenderScene()函数中调用不同的系统函数分别绘制不同属性的点、线、折线、多边形、扇形等;
2)建立一个SDI程序,按照所给资料设置OpenGL图形绘制环境,并照敲老师所给实列,观看结果,查看关键代码区;
3)仿照所给列子,改写代码,绘制彩色的正方体;
三.实验结果
基本图形显示正确
基本图形截图:
三棱柱截图:
实验四、二维图形变换程序设计
一.实验目的:
1)掌握图形变换实现原理,基本几何变换,复合变换等;
2)学习使用VisualC++开发菜单,对话框等交互界面的设计;
3)学习使用MFC单文档程序,实现二维图形的基本几何变换。
二.实验内容:
使用VisualC++建立一个单文档程序,采用实验二中定义的基本图形类。
在程序中增加图形变换菜单(各基本变换对应菜单项),各图形变换的参数通过对话框提供(设计提供变换参数的对话框,如平移,旋转,比例等),实现二维图形的变换。
(提示:
在各个图形类中增加相应的成员函数实现平移;菜单选择变换弹出对应变换的参数对话框,对话框中提供参数后取出参数传递给图形对象,通过调用图形变换成员函数实现图形对象的变换)。
要求实现直线段、圆、多边形等基本图形的几何变换。
三.实验过程:
(1).根据实验要求,新建菜单,增加二维图形变换子菜单,然后在菜单上添加平移,比例,对称,旋转以及错切选项。
(2).对菜单中的每一项方法构造响应函数,并给几个需要弹出对话框的选项添加对话框响应函数。
(3).在弹出的对话框输入参数,获取输入的参数,调用相应的变换函数,实现图形的变换。
四.实验结果:
结果正确。
平移xy(100,0)
五、实验主要代码
classCTransform//二维几何变换
public:
CTransform();
virtual~CTransform();
voidSetMat(CP2*,int);
voidIdentity();
voidTranslate(double,double);//平移变换矩阵
voidScale(double,double);//比例变换矩阵
voidScale(double,double,CP2);//相对于任意点的比例变换矩阵
voidRotate(double);//旋转变换矩阵
voidRotate(double,CP2);//相对于任意点的旋转变换矩阵
voidReflectOrg();//原点反射变换矩阵
voidReflectX();//X轴反射变换矩阵
voidReflectY();//Y轴反射变换矩阵
voidShear(double,double);//错切变换矩阵
voidMultiMatrix();//矩阵相乘
doubleT[3][3];
CP2*POld;
intnum;
};
voidCTransform:
Translate(doubletx,doublety)//平移变换矩阵
Identity();
T[2][0]=tx;
T[2][1]=ty;
MultiMatrix();
Scale(doublesx,doublesy)//比例变换矩阵
T[0][0]=sx;
T[1][1]=sy;
Scale(doublesx,doublesy,CP2p)//相对于任意点的整体比例变换矩阵
Translate,;
Scale(sx,sy);
Rotate(doublebeta)//旋转变换矩阵
doublerad=beta*PI/180;
T[0][0]=cos(rad);T[0][1]=sin(rad);
T[1][0]=-sin(rad);T[1][1]=cos(rad);
实验五、二维交互式图形程序设计
一、实验目的:
1)综合使用VC++编写Win32应用的方法(单文档、多文档、对话框);
2)掌握交互式绘图程序设计及MFC相关类的使用;
3)掌握使用MFC的编写简单动画程序。
二、实验任务:
1)使用MFCAppWizard建立一个SDI程序。
综合前几次二维绘图
实验的结果,实现基本功能:
建立绘制点、直线段、圆、椭圆、圆弧、多段线(折线)、多边形、贝塞尔(Bezier)曲线的相关类(对于封闭图形,应能多种方式填充)、字符串。
使用实验二中自定义的CClientDC的派生类,实现交互式(鼠标)绘制以上图形。
实现颜色、线型、字体等的交互式选择,实现除曲线、圆弧外其他图形的鼠标拾取(框选、点选)。
实现新建文件、保存文件,打开文件(打开保存的自定义图形文件,并绘制图形)。
软件界面设计(工具栏、菜单、光标等)。
可选扩展功能:
(1)实现平移、旋转、缩放、对称、错切等图形几何变换
(2)图形的显示控制包括缩放(按比例、选取框)、平移(上、小、左、右)。
(3)实现图层功能(可见性、颜色、锁定等)、图块功能(及选中多个图形形成一组,图块的生成、引用、编辑)。
(4)图形的显示控制包括实时缩放、实时平移和定点平移等。
(5)图形的编辑控制包括撤销、重复、剪切、复制、粘贴、删除、清除。
2)本任务是在以上程序的基础上,增加动画功能(可单独增加相应菜单):
交互式绘制三个圆作为太阳、地球、月球(要求填充,注意位置。
数据放入文档类,即文档类有变量太阳、地球、月球等),实现二维动画:
月球绕地球转、地球自转(地球采用图案填充)、地球绕太阳公转(按时间比例,可设置参数:
时间、颜色、调整大小)。
三、实验过程:
1)建立绘制点、直线段、圆、椭圆、圆弧、多段线(折线)、多边形、贝塞尔(Bezier)曲线的相关类
2)在菜单栏上增加相应的菜单,用来选择不同的功能
3)对增加的菜单栏设置ID,并且在View类中添加相应的事件响应函数,在各自的响应函数中实现各自的功能
四、实验结果:
基本功能:
扩展功能(做一个简单的太阳系):
在附加功能中,点击“开始”图形开始变换,点击“停止”图形静止。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1