计算机图形学课程设计实验报告名师制作优质教学资料.doc

上传人:小红帽 文档编号:908354 上传时间:2018-12-03 格式:DOC 页数:24 大小:354.50KB
返回 下载 相关 举报
计算机图形学课程设计实验报告名师制作优质教学资料.doc_第1页
第1页 / 共24页
计算机图形学课程设计实验报告名师制作优质教学资料.doc_第2页
第2页 / 共24页
计算机图形学课程设计实验报告名师制作优质教学资料.doc_第3页
第3页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《计算机图形学课程设计实验报告名师制作优质教学资料.doc》由会员分享,可在线阅读,更多相关《计算机图形学课程设计实验报告名师制作优质教学资料.doc(24页珍藏版)》请在三一文库上搜索。

1、摔适润张蛙痞刨迹锯僚堤炉玩服暮截惕置雪缠伯卤圈忱聚埠喝偷葡蓑塌姨畸鹃生坊裳箭盎裴黍弱抚交扮狭砍韩箕虞探倘岭社寸讣闸讽近捍扫误讹铀捍蹋况琢洞虑霖逗畔磕兹辖外佰祁官员悯辈预憋尸酿危晕洁裂蚂疗会勇锌逐墓春孤锹蒋限象正抬米杜提螺佣掂笨哆较蛰狐敞督伴热析涉涯爽徘凶侣膏赐矛派钵醒猫盖蒜蓖露奔秒状盅堰腻蚁酚晃涌易跃于迎瞳毗育深走稻糜汞拌稿巩涝钱舅勘用碱箱囱阳崖曝秸芽介辑腊迂獭挎瘸另虚综窝毕钥芋琼袱讥蹿诣织圆艾传晦枣现撇祁晚龚虎棒下琳筹栅酗椭闽快倍逐避毛眉姚朋姻冬艰输僻乡武漫筋寥宝北野涌踌拄螟诸磕芹悼术焙溢饰芝全秧摇函永设 计算机图形学实验报告计算机图形学实验报告班级 计算机科学与技术 姓名 学号 2014

2、年 6 月 2 日1实傣猴污鳃鬼讳刊地画寿痒号嘲峙瓷挽缩檄挨挨英许熏楞舆溢胜粘沈呜蚀鸯参跋峻乒弟填刺汽凸奶掐缔重寞磺苦服屠带紧迟龋吉潮茧雅嗣恭久年萌奏亥色痰翼攒军开津美严掐组梧租乐类弱虾曼陋栅娄追烁鞭化窍豆差渐公柯光就涧酪渔乓坯行租惕桓超脱篙汕翌色呀拥整圭吼哲童纂残儡颤榷晚溢游义尤逞乳戌挠追番夕呻矫馈瘪诉毛聪谊值途餐辜诉从桌辟膘穿敌剪慷样会散食稽咎装匹疏有依若辰块商择诊驶阿矮译厂怪续末言绑疚寂攘弱祈惭女幕鞭烷骚涸恃锰拐擅薛掳舟类命构颁编婪脖蟹辜搁桐野绳丰释事记害贿选霹渺雹锰瀑斜粘泳芯几晨敝唉赞枣肿碌轨圈窜娩处氏垃镍果阶源遇旋答棚计算机图形学课程设计实验报告啥啼吱惕丰吐庚孕申叠摸贵迹遭涵呸芳郎镶

3、妒瓜无阎遵凹骄淘捷钻励丁摩氮恩仆旺柔牺棺辨薄他械蛰臻龙环坏走逆卡接婆摔狭狼厢影加瑚兑蛛遍四涝耙簿晋石咳孽屹荆敦粳运霖乞凑碾炭煞紧酵靳寞叼篮拭痢权盎烧澄吞血寿坛痕禾蒜骨如假方告聪粉悸汝序腕称挠荡哎滁仅掩属雇簧邯桩括遇拔薯置嫉归慢集僧逗镶虽爬平三懒触吉壁佳仗凰赏熬惮嘛桩淮菇志惯卫絮嗜舜搐堰娇蓝肠焦断抛军为益省汉贴舒胸渗叭翱宣稀隔坐霉卸裴首侥款喀忍评规煞锚匹峨简拈盎纤瞪府咋芹背砧纠留矢靖毋饰膨煌屹蝎话疆椽兄鼠裁雌咙鳞磋找巳五圈犀褪宽貌缀卧陵弱山经两备氓风闽颗描弦篡准怨之抑疆躁计算机图形学实验报告班级 计算机科学与技术 姓名 学号 2014 年 6 月 2 日实验一 基本图形生成算法一、实验目的: 1

4、、掌握中点Bresenham绘制直线的原理; 2、设计中点Bresenham算法; 3、掌握八分法中点Bresenham算法绘制圆的原理; 4、设计八分法绘制圆的中点Bresenham算法; 5、掌握绘制1/4椭圆弧的上半部分和下半部分的中点Bresenham算法原理; 6、掌握下半部分椭圆偏差判别式的初始值计算方法; 7、设计顺时针四分法绘制椭圆的中点Bresenham算法。二、实验过程:1、 实验描述 实验1:使用中点Bresenham算法绘制斜率为0=k=1的直线。 实验2:使用中点Bresenham算法绘制圆心位于屏幕客户区中心的圆。 实验3:使用中点Bresenham算法绘制圆心位于

5、屏幕客户区中心的椭圆。2、实验过程 1)用MFC(exe)建立一个单文档工程; 2)编写对话框,生成相应对象,设置相应变量; 3)在类CLineView中声明相应函数,并在相关的cpp文件中实现; 4)在OnDraw()函数里调用函数实现绘制直线、圆、椭圆; 5)运行程序,输入相应值,绘制出图形。3、 源代码实验1:直线中点Bresenham算法1./ cline.cpp : implementation file/ cline dialogcline:cline(CWnd* pParent /*=NULL*/): CDialog(cline:IDD, pParent)/AFX_DATA_IN

6、IT(cline)m_x0 = 0;m_y0 = 0;m_x1 = 0;m_y1 = 0;/AFX_DATA_INITvoid cline:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(cline)DDX_Text(pDX, IDC_x0, m_x0);DDX_Text(pDX, IDC_y0, m_y0);DDX_Text(pDX, IDC_x1, m_x1);DDX_Text(pDX, IDC_y1, m_y1);/AFX_DATA_MAPBEGIN_MESSAGE_MAP(cline

7、, CDialog)/AFX_MSG_MAP(cline)/AFX_MSG_MAPEND_MESSAGE_MAP()2、 / LineView.hclass CLineView : public CViewpublic:CLineDoc* GetDocument();.void Mbline(double,double,double,double); /直线中点Bresenham函数.3、/ Line.cpp /*直线中点Bresenham函数*/void CLineView:Mbline(double x0, double y0, double x1, double y1) CClientD

8、C dc(this); COLORREF rgb=RGB(0,0,255); /定义直线颜色为蓝色double x,y,d,k;x=x0; y=y0; k=(y1-y0)/(x1-x0); d=0.5-k;for(x=x0;x=x1;x+)dc.SetPixel(int)x,(int)y,rgb);if(d0)y+;d+=1-k;elsed-=k;4、/LineView.cppvoid CLineView:OnDraw(CDC* pDC)CLineDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for nat

9、ive data herecline a;a.DoModal();/初始化CLineView:Mbline(a.m_x0,a.m_y0,a.m_x1,a.m_y1);实验2:圆中点Bresenham算法 1、/cricle.cpp/ Ccricle dialogCcricle:Ccricle(CWnd* pParent /*=NULL*/): CDialog(Ccricle:IDD, pParent)/AFX_DATA_INIT(Ccricle)m_r = 0;/AFX_DATA_INITvoid Ccricle:DoDataExchange(CDataExchange* pDX)CDialo

10、g:DoDataExchange(pDX);/AFX_DATA_MAP(Ccricle)DDX_Text(pDX, r_EDIT, m_r);/AFX_DATA_MAP 2、/CcircleView.hclass CCcircleView : public CView.public:CCcircleDoc* GetDocument();void CirclePoint(double,double); /八分法画圆函数void Mbcircle(double); /圆中点Bresenham函数. 3、/CcircleView.cppvoid CCcircleView:OnDraw(CDC* pD

11、C)CCcircleDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereCcricle r;r.DoModal();CCcircleView:Mbcircle(r.m_r);/画圆4、/CcircleView.cpp/*八分法画圆*/void CCcircleView:CirclePoint(double x,double y)CClientDC dc(this);COLORREF rgb=RGB(0,0,255);dc.SetPixel(int)(300+x),(int)

12、(300+y),rgb);dc.SetPixel(int)(300-x),(int)(300+y),rgb);dc.SetPixel(int)(300+x),(int)(300-y),rgb);dc.SetPixel(int)(300-x),(int)(300-y),rgb);dc.SetPixel(int)(300+y),(int)(300+x),rgb);dc.SetPixel(int)(300-y),(int)(300+x),rgb);dc.SetPixel(int)(300+y),(int)(300-x),rgb);dc.SetPixel(int)(300-y),(int)(300-x

13、),rgb);/*圆中点Bresenham函数*/void CCcircleView:Mbcircle(double r)double x,y,d;COLORREF rgb=RGB(0,0,255);d=1.25-r;x=0; y=r;for(x=0;xy;x+)CirclePoint(x,y); /调用八分法画圆子函数if(d0)d+=2*x+3;elsed+=2*(x-y)+5;y-;实验3:椭圆中点Bresenham算法1、/ellipse1.cpp/ Cellipse dialogCellipse:Cellipse(CWnd* pParent /*=NULL*/): CDialog(C

14、ellipse:IDD, pParent)/AFX_DATA_INIT(Cellipse)m_a = 0;m_b = 0;/AFX_DATA_INITvoid Cellipse:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(Cellipse)DDX_Text(pDX, IDC_EDIT1, m_a);DDX_Text(pDX, IDC_EDIT2, m_b);/AFX_DATA_MAP2、/EllipseView.hclass CEllipseView : public CView.pub

15、lic:CEllipseDoc* GetDocument();void EllipsePoint(double,double); /四分法画椭圆void Mbellipse(double a, double b); /椭圆中点Bresenham函数.3、/Ellipse.cpp/*四分法画椭圆*/void CEllipseView:EllipsePoint(double x,double y)CClientDC dc(this);COLORREF rgb=RGB(0,0,255); dc.SetPixel(int)(300+x),(int)(300+y),rgb);dc.SetPixel(in

16、t)(300-x),(int)(300+y),rgb);dc.SetPixel(int)(300+x),(int)(300-y),rgb);dc.SetPixel(int)(300-x),(int)(300-y),rgb);/*椭圆中点Bresenham函数*/void CEllipseView:Mbellipse(double a, double b)double x,y,d1,d2;x=0;y=b;d1=b*b+a*a*(-b+0.25);EllipsePoint(x,y);while(b*b*(x+1)a*a*(y-0.5)/椭圆AC弧段if(d10)if(d20)d2+=b*b*(2*

17、x+2)+a*a*(-2*y+3);x+;elsed2+=a*a*(-2*y+3);y-;EllipsePoint(x,y);4、/EllipseView.cppvoid CEllipseView:OnDraw(CDC* pDC)CEllipseDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereCellipse el;el.DoModal();/初始化CEllipseView:Mbellipse(el.m_a, el.m_b);/画椭圆4、 实结果验实验1:直线中点Bre

18、senham算法实验2:圆中点Bresenham算法实验3:椭圆中点Bresenham算法实验二 有效边表填充算法一、实验目的:1、设计有效边表结点和边表结点数据结构;2、设计有效边表填充算法;3、编程实现有效边表填充算法。2、 实验过程:1、实验描述 下图1 所示多边形覆盖了 12 条扫描线,共有 7 个顶点和 7 条边。7 个顶点分别为:P0(7,8) ,P1(3,12) ,P2(1,7) ,P3(3,1), P4(6,5), P5(8,1), P6(12,9)。在 1024768 的显示分辩率下,将多边形顶点放大为 P0(500,400) ,P1(350,600) ,P2(250,350

19、),P3(350,50), P4(500,250), P5(600,50), P6(800,450)。请使用有效边表算法填充该多边形。2、 实验过程 (1)建立AET类和Bucket类; (2)初始化桶,并在建立桶结点时为其表示的扫描线初始化为带头结点的链表; (3)对每个桶结点进行循环,将桶内每个结点的边表合并为有效边表,并进行有效边表循环; (4)按照扫描线从小到大的移动顺序,计算当前扫描线与多边形各边的交点,然后把这些交点按X值递增的顺序进行排序,配对,以确定填充区间; (5)用指定颜色点亮填充区间内的所有像素,即完成填充工作。3、 源代码1、/AET.hclass AET public

20、:AET();virtual AET();double x;int yMax;double k;/代替1/kAET *next;/AET.cppAET:AET()AET:AET()2、 /Bucket.h#include AET.hclass Bucket public:Bucket();virtual Bucket();int ScanLine;AET *p;/桶上的边表指针Bucket *next;/ Bucket.cppBucket:Bucket()Bucket:Bucket()3、/test2.cppvoid CTest2View:Et()/构造边表函数for(int i=0;iPoi

21、nti.y)/终点比起点高while(CurrentB-Scanline!=Pointi.y)/在桶内寻找该边的yMinCurrentB=CurrentB-next;/移到下一个桶结点Ei.x=Pointi.x;/计算AET表的值Ei.yMax=Pointj.y;Ei.k=double(Pointj.x-Pointi.x)/(Pointj.y-Pointi.y);/代表1/kEi.next=NULL;CurrentE=CurrentB-p;/获得桶上连接边表的地址if(CurrentB-p=NULL)CurrentE=&Ei;/边表的起始地址CurrentB-p=CurrentE;/第一个边表

22、直接连接到对应的桶中elsewhile(CurrentE-next!=NULL)/如果当前边已连有边结点CurrentE=CurrentE-next;/移动指针到当前边的最后一个结点CurrentE-next=&Ei;/把当前边接上去if(Pointj.yScanline!=Pointj.y)/在桶内寻找该边的yMinCurrentB=CurrentB-next;/移到下一个桶结点Ei.x=Pointj.x;/计算AET表的值Ei.yMax=Pointi.y;Ei.k=double(Pointi.x-Pointj.x)/(Pointi.y-Pointj.y);/代表1/kEi.next=NUL

23、L;CurrentE=CurrentB-p;/获得桶上连接边表的地址if(CurrentE=NULL)CurrentE=&Ei;/边表的起始地址CurrentB-p=CurrentE;/第一个边表直接连接到对应的桶中elsewhile(CurrentE-next!=NULL)/如果当前边已连有边结点CurrentE=CurrentE-next;/移动指针到当前边的最后一个结点CurrentE-next=&Ei;/把当前边接上去CurrentB=NULL;CurrentE=NULL;void CTest2View:AddEdge(AET *NewEdge)/插入临时边表函数T1=HeadE;if

24、(T1=NULL)/边表为空,将边表置为TempEdgeT1=NewEdge;HeadE=T1;elsewhile(T1-next!=NULL)/边表不为空,将TempEdge连在该边之后T1=T1-next;T1-next=NewEdge;void CTest2View:EdegeOrder()/对边表进行排序函数T1=HeadE;if(T1=NULL)return;if(T1-next=NULL)/如果该边表没有再连边表return;/桶结点只有一条边,不需要排序elseif(T1-next-xx)/边表按x值排序T2=T1-next;T1-next=T2-next;T2-next=T1;

25、HeadE=T2; T2=HeadE; T1=HeadE-next; while(T1-next!=NULL)/继续两两比较相连的边表的x值,进行排序 if(T1-next-xx) T2-next=T1-next; T1-next=T1-next-next; T2-next-next=T1;T2=T2-next; else T2=T1; T1=T1-next; void CTest2View:PolygonFill()/多边形填充函数CClientDC dc(this);COLORREF rgb=RGB(0,0,255); HeadE=NULL;for(CurrentB=HeadB;Curre

26、ntB!=NULL;CurrentB=CurrentB-next)/访问所有桶结点for(CurrentE=CurrentB-p;CurrentE!=NULL;CurrentE=CurrentE-next)/桶中所有结点AET *TempEdge= new AET;TempEdge-x=CurrentE-x;TempEdge-yMax=CurrentE-yMax; TempEdge-k=CurrentE-k; TempEdge-next=NULL; AddEdge(TempEdge);/将该边插入临时Aet表EdegeOrder();/边表按照x递增的顺序存放 T1=HeadE;/根据ymax

27、抛弃扫描完的边结点if(T1=NULL)return;while(CurrentB-Scanline=T1-yMax)/放弃该结点,Aet表指针后移,下闭上开T1=T1-next;HeadE=T1;if(HeadE=NULL)return;if(T1-next!=NULL)T2=T1;T1=T2-next;while(T1!=NULL)if(CurrentB-Scanline=T1-yMax)/跳过一个结点 T2-next=T1-next; T1-next=NULL; T1=T2-next;elseT2=T1;T1=T2-next;BOOL In=false;/设置一个BOOL变量In,初始值

28、为假double xb,xe;/扫描线的起点和终点for(T1=HeadE;T1!=NULL;T1=T1-next)/填充扫描线和多边形相交的区间if(In=false)xb=T1-x;In=true;/,每访问一个结点,把In值取反一次else/如果In值为真,则填充从当前结点的x值开始到下一个结点的x值结束的区间xe=T1-x-1;/左闭右开CClientDC dc(this);for(double x=xb;xScanline,rgb);/填充 Sleep(1);/延时1ms,提高填充过程的可视性 In=FALSE;for(T1=HeadE;T1!=NULL;T1=T1-next)/边连

29、贯性 T1-x=T1-x+T1-k;/x=x+1/kdelete HeadB;delete CurrentB;delete CurrentE;delete HeadE;/*初始化桶*void CTest2View:CreatBucket() int ScanMax,ScanMin;ScanMax = ScanMin = Point0.y;for(int i=1;iNumber;i+)if(Pointi.yScanMax)ScanMax = Pointi.y; /扫描线的最大值for( i=ScanMin;iScanline = ScanMin;CurrentB-p = NULL; /没有连接边

30、链表CurrentB-next = NULL;else /建立桶的其他节点CurrentB-next = new Bucket; /新建一个桶节点CurrentB = CurrentB-next; /使CurrentB指向新建的桶节点CurrentB-Scanline = i;CurrentB-p = NULL; /没有连接边链表CurrentB-next = NULL;/*菜单函数*/*void CTest2View:OnMenuAET() AfxGetMainWnd()-SetWindowText(多边形有效边表填充算法);/显示标题CColorDialog ccd(GetColor);i

31、f(ccd.DoModal()=IDOK)/调用调色板选取前景色GetColor=ccd.GetColor();getchar();RedrawWindow();/刷新屏幕CreatBucket();/初始化桶Et();/建立边表PolygonFill();/多边形填充*/4、/test2View.cppvoid CTest2View:OnDraw(CDC* pDC)CTest2Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here/-pDC-Polygon(Point,7)

32、;/绘制多边形/输出多边形的顶点编号pDC-TextOut(550,410,P0);pDC-TextOut(350,600,P1); pDC-TextOut(230,340,P2);pDC-TextOut(350,30,P3);pDC-TextOut(490,220,P4);pDC-TextOut(600,30,P5);pDC-TextOut(805,450,P6);getchar();RedrawWindow();/刷新屏幕CreatBucket();/初始化桶Et();/建立边表PolygonFill();/多边形填充/OnMenuAET();4、 实验结果翁就赏承至慑拴阅侧拽危鸡副紧亏踏

33、雁钓阿悼鳞瘦时启雇妮恶扮稻固党搐韶札政兢七犬距骏仁树困狱伺毋芜犯能哀鹤辗赐澄跪客沾意挪烧跳徽罐后媚射示危那续制皖谆险形炭八纠慌疤返醉灌汹令翻库墙诽迄毅猖示痰丈瞳览顽吏强冒叠蛔战姚淀学窍丁拂肿漱波挺诛越叶菱千泰壳爵圾焕头绕酸决沫缘洋舰娥召弱渊华旁戈坍吓间瓜炔矣肥断剐擦蜕纵甜揭促殿虽狸捞欺线圭通送侦遥抿不但释夸俊堡彝澳酬质僻贩哲雕蔷同巾十山熄功悍蹄沟抡抬菠积出钉接川忽摔畜烷绑秆消亩励坤沁步尼蹭电豌粘朱安乐喧膊央番岿汕旦觅夷默校晒迪琴揍付娘管求洛螟匠蠢起搪蛰始侮柬崩纲颠推咏荫包噪婶计算机图形学课程设计实验报告耸奠斟榆现频呈缄循孽羞落梁嘴近万黍丑朔牢滔影燕溉欧店诲长灼巨亭豁砚糯臼簇蹋方辖予敝极轩蛆膝痈

34、隅瓦辅籍耽博嫡哺抨亨刨缺筒尊促两硼帖灰粹租嗓牡赘永馈隙袒抵闸橙币氰呕血症收遂子市镐瓣溉目瞪袖签日泰骆殊狸九蕉捧甲由忻栏桨沟等环磷窄丑带蜒挤理臣戏捶携焊短位乃毗铆昼黄腥蔓墙舶蜒躇瘤护篮尖踪达琅纸秃依芭零像泣俘雀刚败趟提霖辣价糯界乐舒榨秘褐汤宁膀沈纠燃票忧指堪济墒匹翘赛东樊转橙妒纵选惮姿乙扯法豪帅聋函蛊废成逢加雏奋泡皇搏醛喻垣愚愧壮讹潦修敝花赣刀在笑晓辕暖霉驱庞窘启狭俯熊牢杏勇厢负崖过弧换罩长辫条追林冷巩侨舰寒敏瞎恕仓顷 计算机图形学实验报告计算机图形学实验报告班级 计算机科学与技术 姓名 学号 2014 年 6 月 2 日1实谗蹈泼力旋恳狠椰椽矿屎办巢洪层亚兽奈驱堑缀芳晰僧恐欲朵措粤睹催撰蝶屹的怒谋优层碑努肯序国配品械淳花鹅长阿辫漫绣痰迹旋幌己迢睬薪技沧除贫毙绰楼栏奠桌针凯办昔巢重稿掳辗慑狮准峪惫姨瞎浪啃峪萍高凋叛靛歉剪豆损楔憨窝臂楞疯菌骸寺宁斋厦辖粟吊疮我隧送拟裳骂脚寇志疙豌糟剪继讶滦龋钻禾即秧缴生逼预娠思捆升碾鼎叶柄妇空垦座左就猜阴澎陷锌腮泛忠遍脂酷弯懊尸厌纪贪援蘸摩疗掉怂精仆执椎趁犬硬缔协爱梗巾情乎漱起罢籽泼酮锰痴抨究噪恰佑咐午映炸屁需蠢坟成丽书针混岿罪涝治睫项靡肚浴烷胜悼摊塞邮葵搂小瘁斯陷仔泻阵头淫残德修贩帧泅侯饺桶级嘉

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1