计算机图形学第三版实验报告,计算机图形学实验报告实验三

《计算机图形学实验报告实验三》由会员分享,可在线阅读,更多相关《计算机图形学实验报告实验三(22页珍藏版)》请在人人文库网上搜索。

1、贵州大学实验报告学院:计算机科学与信息学院 专业:计科 班级:计科101姓名徐艳学号1008060042实验序号实验三实验时间2013-4-22指导教师吴云成绩实验项目名称多边形扫描转换实验目的掌握光栅显示系统中多边形的扫描转换和区域填充算法。掌握4连通与8连通区域的扩展性。实验要求实现多边形的扫描转换算法和区域填充算法。(任选两个算法并实现)实验原理1024681012024681234扫描线算法:算法原理:非自交多边形(边与边之间除了顶点外无其它交点)判断扫描线上的点是否在多边形之内,根据多边形区域连续性,分为3个步骤:(1)求出扫描线与多边形所有边的交点;(2)把这些交点的x坐标值以升序。

2、排列;(3)对每一对交点间的区域进行填充。第三个步骤是从奇数个交点出发到偶数个交点。如上图,对y8的扫描线排序x坐标得到的表是(2,4,9,13),然后对交点2与4之间、9与13之间的所有象素点进行填充。几点规则:边界上的象素:“左闭右开”,“下闭上开”(将左边界和下边界的点算为内部,而将右边界和上边界算为外部)顶点:“上开下闭”。区域填充算法:算法原理:区域填充对区域重新着色的过程。(1)将指定的颜色从种子点扩展到整个区域的过程(2)区域填充算法要求区域是连通的l连通性: 4连通、8连通算法实现简单描述:堆栈结构实现种子算法,四向算法:1、种子象素压入堆栈2、若堆栈非空,即有区域中象素在堆栈。

3、中,做如下循环:A.栈顶象素出栈;B.将出栈象素置为多边形颜色;C.按左、上、右、下四个方向左右顺序检查与出栈象素相邻的四个象素,若其中某象素不在边界置为多边形颜色,则将该象素推入堆栈。边填充算法-正负相消法算法原理:对每一条扫描线和每条多边形边的交点,都将扫描线上右边的所有象素求余。(偶数次取余,结果不变,)设A为一正整数,正整数M的余定义为A-M,记为 风。当计算机中用n位表示M时,可取A为n位能表示的最大整数,即A=2n-1。可知即对M作偶数次取余,结果仍为M。求余可用异或显示模式实现。以扫描线为中心的边缘填充法:设是当前扫描线与多边形的交点的x坐标数列,填充该扫描线上位于多边形内的区段。

4、由下列步骤完成:算法1(以扫描线为中心的边缘填充算法)1、将当前扫描线上的所有象素着上颜色;2、求余:for(i = 0;i ScanMax)ScanMax=Pointi.y;/扫描线的最大值for(i=ScanMin;iScanLine=ScanMin;CurrentB-p=NULL;/没有连接边链表CurrentB-next=NULL;else/建立桶的其它结点CurrentB-next=new Bucket;/新建一个桶结点CurrentB=CurrentB-next;/使CurrentB指向新建的桶结点CurrentB-ScanLine=i;CurrentB-p=NULL;/没有连接边。

5、链表CurrentB-next=NULL;构造边表:void CPolyFill1View:Et()/构造边表for(int i=0;iPointi.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;/获得桶上链接。

6、边表的地址if(CurrentB-p=NULL)/当前桶结点上没有链接边结点CurrentE=&Ei;/赋边的起始地址CurrentB-p=CurrentE;/第一个边结点直接连接到对应的桶中elsewhile(CurrentE-next!=NULL)/如果当前边已连有边结点CurrentE=CurrentE-next;/移动指针到当前边的最后一个边结点CurrentE-next=&Ei;/把当前边接上去if(Pointj.yScanLine!=Pointj.y)CurrentB=CurrentB-next;Ei.x=Pointj.x;Ei.yMax=Pointi.y;Ei.k=double(。

7、Pointi.x-Pointj.x)/(Pointi.y-Pointj.y);Ei.next=NULL;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;算法执行过程:初始化时先构造桶链表,然后将多边形的各边按照规则加入到桶的各个节点中,然后按照y值递增的顺序将每个节点上的边进行排序,然后配对之后即进行填充;其。

8、后顺序执行此过程,直到所有的边全部遍历结束,至此,填充完成。区域填充算法(种子填充算法):算法原理简单描述:种子填充算法的实现比较简单,并不需要很多的数据结构,只需利用堆栈即可。先种子象素压入堆栈,若堆栈非空,即有区域中象素在堆栈中,做如下循环:A.栈顶象素出栈;B.将出栈象素置为多边形颜色;C.按左、上、右、下四个方向左右顺序检查与出栈象素相邻的四个象素,若其中某象素不在边界置为多边形颜色,则将该象素推入堆栈。算法实现主要数据结构:堆栈节点:class Stack_node public:Stack_node();virtual Stack_node();CPoint PixelPoint;。

9、Stack_node *Next;算法实现主要函数:入栈函数:void CPolyFill2View:Push(CPoint point)/入栈函数Base=Head;Last=new Stack_node;Last-PixelPoint=point;Last-Next=NULL;if(Base=NULL)/空链Head=Last;return;while(Base-Next!=NULL)Base=Base-Next;/指向新建的结点Base-Next=Last;出栈函数:Stack_node *CPolyFill2View:Pop()/出栈函数/弹出栈顶元素Base=Head;if(Base。

10、-Next=NULL)Head=NULL;return Base;while(Base-Next!=NULL)Base=Base-Next;if(Base-Next=Last) Base-Next=NULL;return Last;return NULL;区域填充函数:void CPolyFill2View:PolygonFill()/区域填充函数CClientDC dc(this);COLORREF FillColor,BoundaryColor,PixelColor;/填充色,边界色,当前点像素色BoundaryColor=RGB(0,0,0);/边界色为黑色FillColor=RGB(2。

11、55,0,0);/填充色为红色Head=new Stack_node();/建立堆栈结点Head-PixelPoint=Seed;/种子结点入栈Head-Next=NULL;while(Head!=NULL)/如果栈不为空Stack_node *PopPoint;PopPoint=Pop();if(PopPoint=NULL)dc.TextOut(10,10,填充完毕);dc.DeleteDC();return;Last=Base;dc.SetPixel(PopPoint-PixelPoint,FillColor);/画蓝色种子/搜索出栈结点的左方像素PointLeft.x=PopPoint-。

12、PixelPoint.x-1;PointLeft.y=PopPoint-PixelPoint.y;PixelColor=dc.GetPixel(PointLeft.x,PointLeft.y);if(PixelColor!=BoundaryColor & PixelColor!=FillColor) /搜索出栈节点的上方像素 /搜索出栈节点的右方像素 /搜索出栈节点的下方像素算法有缺点:算法优点:简单。算法缺点:算法是深度递归的,效益低。要求很大的存储空间来实现堆栈。实验结果多边形扫描转换填充算法:运行填充算法进行多边形填充:种子填充算法:运行种子填充算法进行多边形填充:实验总结1、 通过本次实验,我对多边形填充算法有了进一步的了解。扫描线算法和填充算法的实现参照了书中的介绍,实现起来难度不是很大。2、 种子填充算法在书中没有详细的介绍,我们小组通过查阅有关资料和网络信息,了解了种子填充算法的过程和原理。3、对于VC+,很多操作上的东西还不是很熟练,以至于做实验的时间延长了很多。不过,在这个过程中,也学会了更多关于vc+使用的方法,这为以后更好的使用提供了基础。总的来说,这次实验让我受益匪浅。指导教师意见签名: 年 月 日。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值