计算机图形学课程设计报告_第1页
计算机图形学课程设计报告_第2页
计算机图形学课程设计报告_第3页
计算机图形学课程设计报告_第4页
计算机图形学课程设计报告_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、江西理工大学应用科学学院信息工程系计算机科学与技术教研室 计算机图形学 课程设计报告试验名称 计算机图形学实验 共 10 页成绩 实验日期 2008 年 7月 1 日班级微机051班 组别 交报告日期 2008 年 7月 15 日学号 0214020415 姓名 段石林同组学生 教师审批签字图形学实验报告 计算机051班32号段石林一、 实验目的:通过本实验 ,使自己了解计算机图形学的有关原理、算法及系统,掌握基本图形显示程序设计方法,及二维和三维图形变换程序设计方法,为进一步学习计算机辅助设计方面的技术知识打下基础。二、 实验内容和要求:1、实验内容 直线和圆的生成,设定屏幕图形工作方式,彩

2、色象素的读写,直线和圆的扫描转换。 多边形的裁剪和填充 图形变换:二维变换、及投影、透视变换2、上机实验要求上机实验是巩固课堂内容。增强感性认识。实验后要求学生认真编写实验报告,作为学生平时成绩的依据。三、 实验报告:1、 实验环境:VStudio6.0的VC6.0,MFC2、 实现功能:a) 直线和圆的生成,直线和圆的扫描转换。并且实现了用鼠标点击取点的交互功能。b) 多边形的裁剪和填充,实现了点扫描与直线扫描多边形。c) 直线剪裁,并可以自动判断与某条或某些条直线可剪裁,剪裁结果是一条线段生成两到三条线段,并可在文档中保存。d) 图形变换:二维变换:平移、旋转、缩放功能,其中平移已实现了鼠

3、标点击取点的交互功能。e) 提供了用户对对象的选择,再在在被选择的对象上进行相应操作。f) 实现了文档存储与打开。3、 文件格式:1、 Graph1.txt文件格式是:第一行表示有3种类形的图元数据,在本程序中为3,分别为直线,圆,多边形,第二行为第一个数据为类型,1表示为直线容器,第二个数据3表示此直线容器(用双链表实现)中有3条直线。下面3行的格式相同,分别是颜色,起点、终点的x、y坐标。第六行中3表示类型3是多边形,2表示多边形个数。再下面就是各个多边形的信息的,0表示不用填充,15550是颜色值,3表示3边形。下面三行是三个顶点的x、y坐标。11-16行信息同理。17行2表示类型2为圆

4、,1表示1个,18行各个数据分别表示,是否填充、颜色、圆心x、y坐标、半径。2、 可以直接用记事等不带格式的文本编辑器按文件格式进行手工修改,注意:一定要按格式,否则将不能生成你想要的图元。4、 所用数据结构:1、 GraphObject:本程序得用一个数据结构把所有的图元装入了,并可以根据不同的类型,做不同的动作,类的定义如下:/GraphObject是用来存放各种图形对象的,根据type的不同,/object做不同的类型转换.class GraphObject private:void * object;int type;public:GraphObject();GraphObject(v

5、oid *Object,int Type);virtual GraphObject();/根据type的不同,做不同的动作。bool action(CDC *pCDC);/根据type的不同,保存不同为格式。bool save(ofstream &out);再用CList GraphList;容器把所有的对象都装入进去了。当然,后来为了方便,再加了三个容器,这个容器的作用就不大了,可它却体现了大自然的面向对象的基本原理,值得关注。2、 Matrix:#define PI 3.1415926/3*3矩阵类:class Matrix public:Matrix();Matrix(const Mat

6、rix & mat);Matrix(int tx,int ty);Matrix(float tx,float ty);virtual Matrix();float array33;void SetIdentity();/设置对角为1,其余为0Matrix& operator*(const Matrix & mat);/矩阵乘法.Matrix& operator+(const Matrix & mat);/矩阵加法/将点通过矩阵转换为另一个点.POINT & pointTrans(POINT & point);3、 MidLine:#define Precision 5/此为选择对象的精确度 /

7、线段类:class MidLine public:MidLine();MidLine(int x0,int y0,int x1,int y1);MidLine(POINT Point0,POINT Point1);virtual MidLine();void MidPointLine(CDC *pCDC);void setColor(COLORREF Color);bool SelectIt(POINT point);/二维复合变换void move(POINT point);void rotate(float a, CPoint refpt);void scale(float sx, flo

8、at sy, CPoint refpt);bool select;POINT point0,point1;COLORREF color;private:void MidPointLine0(int x0,int y0,int x1,int y1,int color,int index,CDC *pCDC);4、 MidCircle:#define PI 3.1415926/3*3矩阵类:class Matrix public:Matrix();Matrix(const Matrix & mat);Matrix(int tx,int ty);Matrix(float tx,float ty);v

9、irtual Matrix();float array33;void SetIdentity();/设置对角为1,其余为0Matrix& operator*(const Matrix & mat);/矩阵乘法.Matrix& operator+(const Matrix & mat);/矩阵加法/将点通过矩阵转换为另一个点.POINT & pointTrans(POINT & point);5、 Polygon:#include #include #include #define Precision 5/此为选择对象的精确度 /扫描线算法中的“边”数据结构表示struct Edge int y

10、;/边的上端点的y坐标float x;/AEL中当前扫描线与边的交点(或ET中边的下端点的x坐标)float deltax;/边的斜率的倒数/定义边类型的大小比较关系(用于排序)friend bool operator (const Edge&, const Edge&);/结点为边的链表的数据类型typedef std:list EgList;/Et表数据类型typedef std:map EtType;/多边形类:class polygon public:/多边形数据结构表示int count;/多边形顶点数POINT* pPointArray;/多边形顶点数组COLORREF color

11、;bool Fill;/是否填充bool select;/是否为当前选择对象bool SelectIt(POINT point);/判断当前点是否选中多边形EtType et;EgList ael;/四个构造函数polygon();polygon(int Count,POINT* pPoint);polygon& operator=(const polygon& py); virtual polygon();/下面四个函数为扫描填充多边形int toInt(float a, int type);void init();void drawLine(int xLeft, int xRight, i

12、nt y, CDC *pDC);void LineScan(CDC* pDC );void setColor(COLORREF Color);/画多边形,根据Fill是否填充.void drawPoly(CDC *pCDC);/二维复合变换void move(POINT point);void rotate(float a, CPoint refpt);void scale(float sx, float sy, CPoint refpt);private:polygon(const polygon& py);5、 调试经验:我在调试这个程序的时候遇到了一些“低级”错误,也理解了关于C+的一些

13、高级主题,为方便大家的交流,也方便自已以后的学习,我将这此经验都用注释写在相应的地方了。试举几例:(1)、polygon& polygon:operator=(const polygon& py) /注意下面两行代码,是必须的,/一定要释放对象以前指向的内存区。/详细情况请看polygon:polygon(const polygon& py)的注释if(pPointArray!=NULL) delete pPointArray;count=py.count;pPointArray=new POINTcount;color=15550;Fill=py.Fill ;select=py.select

14、 ;for(int i=0; icount; i+)pPointArrayi=py.pPointArrayi;return *this;polygon:polygon(const polygon& py)/if(pPointArray!=NULL) /delete pPointArray;/!/当用polygon p(py)时,p.pPointArray不会自动设为空!/此时用delete将会产生寻常!/然而:又如何保证在赋值前释放以前的空间呢!?/解答:test类:test.h,注意:如果写成:test c=a则会调用其拷贝构造函数/只有写成test c;c=a;才会调用operator=/

15、基于此,可把拷贝构造函数设为私有,才可保证生成对象时一定会调用默认/构造函数!/但是,如果这样,则在使用这个类时会遇上很多阻碍,那就是你要避免系统/自动调用你的拷贝构造函数,比如当你的函数形参是对象而不是引用时,/因此,这时你最好检查你的函数,使其用引用做为形参,如果不想因函数改变/形参,则设为引用即可./也许,C+在扩充C时加入了一个引用这种奇怪的数值引用方式.count=py.count;pPointArray=new POINTcount;color=15550;Fill=py.Fill ;select=py.select ;for(int i=0; icount; i+)pPointA

16、rrayi=py.pPointArrayi;polygon:polygon(int Count,POINT* pPoint)/由于用此种构造函数时,不会设置pPoint为NULL,/故不用下面两行代码/否则可能删除未初始化指针,产生异常。/if(pPointArray!=NULL) /delete pPointArray; (2)、/画多边形,根据Fill选择是否填充.void polygon:drawPoly(CDC *pCDC)for(int i=0;icount-1;i+)MidLine line(pPointArrayi,pPointArrayi+1);line.setColor (c

17、olor);line.MidPointLine (pCDC);MidLine line(pPointArraycount-1,pPointArray0);line.setColor (color);line.MidPointLine (pCDC);if(Fill)LineScan(pCDC);/下面是用点填充算法实现填充!/由于递归算法太过消耗资源,故将其注释掉/改成线扫描/*int x=0,y=0;for(i=0;icount;i+)/!一个count-1用了我1个半小时/还是上厕所的时候突然想到,for语句控制错误!/可见编程最是要头脑清醒! (3)、POSITION pos=polygo

18、nList.GetHeadPosition(); /注意!:(CList *)object一定要用()号括起来!6、 程序特点:(1)、由于本程序是为了实现图形学的各种算法,因此,哪怕是画直线这样的事也都没有调用MFC提供的函数来实现,全部都是自己编写的。(2)、结构较严谨,在编写的过程中,我注意到了类的结构严谨,文档类视图类的分工合作明确。但还是很遗留了很多冗繁的地方,因为有的一开始就没有注意,到后来也就没有改了。 (3)、保存了调试信息,我在编写代码是时候喜欢由接口到实现,由简单到复杂的顺序编写,最后我保存了那些有价值的调试代码做为注释,以便以后学习与修改。 (4)、纠正并完善了某些书上的

19、算法:我用的图形参考书是:计算机图形学 倪明田、吴良芝 编著,北京大学出版社,但其中很多算法没有用(1)、/此算法在这里有问题,可能是因为我们所用的坐标系/原点在左上角而不是程序假设的左下角./*P0(x0, y0)P1(x1, y1)为待裁剪线段*/* rect为裁剪窗口*/bool CGraphView:CohenSutherlandLineClip(float x0,float y0,float x1,float y1,CutRect *rect,POINT &point0,POINT &point1)(2)、bool CGraphView:CohenSutherlandLineClip

20、(float x0,float y0,float x1,float y1,CutRect *rect,POINT &point0,POINT &point1)函数中:/注意,书上此行代码有问题!/原句是:x=x0+(x1-x0)*(float)rect-ymin-x0)/(y1-y0);/书111面 (3)、在直线的中点算法中,void MidLine:MidPointLine0(int x0,int y0,int x1,int y1,int color,int index,CDC *pCDC) d+=incrE;x+;/注意:书本47面的的程序少了这行代码,应该加上. (4)、直线的中点算法书上只是实现1/8的区域,要以任意点画直线,需要自己做一些转化。7、 待扩充内容:本程序还有很多地方值得改进,由于时间不够,先做到这里,但现在因为我采用了各种类来定义不同的图元,因此,要扩充是很容易的。需要扩充的地方有:图元变换的交互式实现(包括鼠标的变形)、图形类型的添加,如,椭圆,圆弧等, 还有就是调色板对颜色的控制。四、 设计总结:1、 设计收获与体会:比较起这个学期的其他课程来说,我这个图形实验上用的时间是最多的,当然收获也是最大的,做完实验后,不免清点一下:a、对C+语言的进一步应用与理解,最大的收获便是引用,我以前一直对引用总是一知半解,知其然不

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论