版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 NORTHWESTUNIVERSITY 计算机图形学 区域填充的扫描线算法一、实验目的1. 通过实验,进一步理解和掌握几种常用多边形填充算法的基本原理2. 掌握多边形区域填充算法的基本过程3. 掌握在C/C+环境下用多边形填充算法编程实现指定多边形的填充。4. 利用TC2.0编写区域填充的扫描线算法。二、实验内容算法基本思想:首先填充种子点所在扫描线上位于区域内的区段,然后确定与该区段相邻的上下两条扫描线上位于区域内的区段,并依次将各区段的起始位置保存, 这些区段分别被用区域边界色显示的像素点所包围。随后,逐步取出一开始点并重复上述过程,直到所保存各区段都填充完毕为止。 算法描述:扫描线填充
2、算法一般包括四个步骤:求交、排序、交点配对、区域填充。正确求得扫描线与区域填内外轮廓线的交点是算法成败的关键问题。另一方面,采用合适的数据结构又可以简化操作、提高算法的效率。本论文由于采用链表结构记录轮廓线和交点,无需焦点排序的过程,因而提高了算法效率。扫描线来源于光栅显示器的显示原理:对于屏幕上所有待显示像素的信息,将这些信息按从上到下、自左至右的方式显示。扫描线多边形区域填充算法是按扫描线顺序,计算扫描线与多边形的相交区间,再用要求的颜色显示这些区间的象素,即完成填充工作。区间的端点可以通过计算扫描线与多边形边界线的交点获得。对于一条扫描线,多边形的填充过程可以分为四个步骤:(1)求交:计
3、算扫描线与多边形各边的交点;(2)排序:把所有交点按x值递增顺序排序;(3)配对:第一个与第二个,第三个与第四个等等;每对交点代表扫描线与多边形的一个相交区间;(4)填色:把相交区间内的象素置成多边形颜色; 三、实验原理 扫描线填充算法的基本过程如下:当给定种子点(x,y)时,首先填充种子点所在扫描线上的位于给定区域的一个区段,然后确定与这一区段相连通的上、下两条扫描线上位于给定区域内的区段,并依次保存下来。反复这个过程,直到填充结束。 区域填充的扫描线算法可由下列四个步骤实现:(1)初始化:堆栈置空。将种子点(x,y)入栈。(2)出栈:若栈空则结束。否则取栈顶元素(x,y),以y作为当前扫描
4、线。(3)填充并确定种子点所在区段:从种子点(x,y)出发,沿当前扫描线向左、右两个方向填充,直到边界。分别标记区段的左、右端点坐标为xl和xr。(4)并确定新的种子点:在区间xl,xr中检查与当前扫描线y上、下相邻的两条扫描线上的象素。若存在非边界、未填充的象素,则把每一区间的最右象素作为种子点压入堆栈,返回第(2)步。四、实验步骤1. 复习有关算法,明确实验目的和要求; 2. 依据算法思想,绘制程序流程图(指定填充多边形);3. 设计程序界面,要求操作方便;4. 用C/C+语言编写源程序并调试、执行分析实验结果5. 对程序设计过程中出现的问题进行分析与总结;具体做法如下:1) 打印源程序或
5、把源程序以文件的形式提交;分析多边形区域扫描线填充算法的原理,确定算法流程 初始化:构造边表ET,置AET表为空; 将第一个不空的ET表中的边插入AET表; 由AET表取出交点进行配对(奇偶)获得填充区间,依次对这些填充区间着色; y=yi+1时,根据x=xi+1/k修改AET表所有结点中交点的x坐标。同时如果相应的ET表不空,则将其中的结点插入AET表,形成新的AET表; AET表不空,则转(3),否则结束。2)编程实现: 首先确定多边形顶点和ET/AET表中结点的结构; 编写链表相关操作(如链表结点插入、删除和排序等); 根据1)中的算法结合上述已有的链表操作函数实现多边形区域扫描线填充的
6、主体功能; 编写主函数,测试该算法。3)算法描述:void polyfill (多边形 polygon, 颜色 color) for (各条扫描线i ) 初始化新边表头指针NET i;把ymin = i 的边放进边表NET i; y = 最低扫描线号; 初始化活性边表AET为空; for (各条扫描线i ) 把新边表NETi中的边结点用插入排序法插入AET表,使之按x坐标递增顺序排列; 遍历
7、AET表,把y max= i 的结点从AET表中删除,并把y max > i结点的x值递增D x; 若允许多边形的边自相交,则用冒泡排序法对AET表重新排序; 遍历AET表,把配对交点区间(左闭右开)上的象素(x, y),用drawpixel (x, y, color) 改写象素颜色值; /* polyfill */6.五、实验结果及分析 扫描线填充算法是通过沿扫描线填充水平像素段,来处理四连通或八连通相邻点,这样就仅仅只
8、需要将每个水平像素段的起始位置压入栈,而不需要将当前位置周围尚未处理的相邻像素都压入栈,从而可以节省大量的栈空间。六、程序代码 #include "Conio.h"#include "graphics.h" #include "stdio.h" #define closegr closegraphvoid initgr(void) /* BGI初始化 */int gd = DETECT, gm = 0; /* 和gd = VGA,gm = VGAHI是同样效果 */registerbgidriver(EGAVGA_driver);/*
9、 注册BGI驱动后可以不需要.BGI文件的支持运行 */initgraph(&gd, &gm, "");enum BOOLFALSE = 0, TRUE = 1;typedef structint y;int xLeft;int xRight;Span;/*区段*/typedef struct stacknode Span span;struct stacknode *next; stacknode;typedef struct stacknode *top; linkstack; /*-进栈操作-*/ void PushStack(linkstack *s
10、, Span *span) stacknode *p=(stacknode*)malloc(sizeof(stacknode); p->span.y = span->y;p->span.xLeft = span->xLeft;p->span.xRight = span->xRight;p->next=s->top;s->top=p; /*-出栈操作-*/ void PopStack(linkstack *s,Span *span) int x; stacknode *p=s->top; span->y = p->span.
11、y;span->xLeft = p->span.xLeft;span->xRight = p->span.xRight; s->top=p->next; free(p); /*-将栈清空-*/ void SetStackEmpty(linkstack *s)stacknode *p=s->top;while( s->top != NULL)free(p); s->top=p->next; /*-判断栈是否为空-*/ int IsStackEmpty(linkstack *s)if(s->top = NULL) return 1;
12、elsereturn 0;/*-核心程序开始-*/void ScanLineFill4(int x,int y,int oldColor,int newColor)int xLeft,xRight;int i;enum BOOL isLeftEndSet, spanNeedFill;Span span;linkstack *s=(linkstack*)malloc(sizeof(linkstack);s->top = NULL;/*填充并确定种子点(x,y)所在的区段*/i = x;while(getpixel(i,y) = oldColor)/*向右填充*/putpixel(i,y,n
13、ewColor);i+;span.xRight = i - 1; /*确定区段右边界*/i = x - 1;while(getpixel(i,y) = oldColor)/*向左填充*/putpixel(i,y,newColor);i-;span.xLeft = i + 1; /*确定区段左边界*/*初始化*/SetStackEmpty(s);span.y = y;PushStack(s,&span);/*将前面生成的区段压入堆栈*/while( ! IsStackEmpty(s) )/*终止判断*/*出栈*/PopStack(s, &span);/*处理上面扫描线*/y =
14、span.y + 1;xRight = span.xRight;i = span.xLeft - 1;isLeftEndSet = FALSE;while(getpixel(i,y) = oldColor)/*向左填充*/putpixel(i, y, newColor);i-;if( i != span.xLeft - 1)/*确定区段左边界*/isLeftEndSet = TRUE;xLeft = i + 1;i = span.xLeft;while( i < xRight)spanNeedFill = FALSE;while(getpixel(i,y) = oldColor) /*向
15、右填充*/if( ! spanNeedFill)spanNeedFill = TRUE;if( ! isLeftEndSet)isLeftEndSet = TRUE;xLeft = i;putpixel(i,y,newColor);i+;if( spanNeedFill )span.y = y;span.xLeft = xLeft;span.xRight = i - 1;PushStack(s, &span); /*将区段压入堆栈*/isLeftEndSet = FALSE;spanNeedFill = FALSE;/* while(getpixel(i,y) != oldColor)
16、 */i+;/*end of while( i < xRight) */*处理下面一条扫描线,与处理上面一条扫描线完全类似*/y = y - 2;xRight = span.xRight;i = span.xLeft - 1;isLeftEndSet = FALSE;while(getpixel(i,y) = oldColor)/*向左填充*/putpixel(i, y, newColor);i-;if( i != span.xLeft - 1)/*确定区段左边界*/isLeftEndSet = TRUE;xLeft = i + 1;i = span.xLeft;while( i <
17、; xRight)spanNeedFill = FALSE;while(getpixel(i,y) = oldColor) /*向右填充*/if( ! spanNeedFill)spanNeedFill = TRUE;if( ! isLeftEndSet)isLeftEndSet = TRUE;xLeft = i;putpixel(i,y,newColor);i+;if( spanNeedFill )span.y = y;span.xLeft = xLeft;span.xRight = i - 1;PushStack(s, &span); /*将区段压入堆栈*/isLeftEndSet = FALSE;spanNeedFill = FALSE;/* while(getpixel(i,y) != oldColor) */i+;/*end of while( i < xRight) */delay(2000); /*延时*/*end of while( ! isStackEmpty() ) */*end of ScanLineFill4() */*-main()-*/int main()initgr(); /* B
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024版港口物流中心运营合同
- 2025年度安全生产标准化咨询服务及现场指导合同3篇
- 2024生物质锅炉余热回收利用项目合作协议3篇
- 2025年度大理石地暖系统设计与施工合同3篇
- 2024软件系统销售合同系统购买合同
- 2024物业企业服务能力提升与市场拓展合作协议3篇
- 敦煌壁画与文创知到智慧树章节测试课后答案2024年秋酒泉职业技术学院
- 森林防火施工员聘用协议
- 建筑工程节能改造合同
- 别墅锌钢栏杆安装施工协议
- 校长在评估反馈会上的表态发言稿(5篇)
- 个人贷款业务营销技巧课件
- 新人教版小学三年级数学上册知识点整理归纳培训课件
- 霉菌性阴道炎VVC的分类及诊治
- 预制舱技术方案思源弘瑞课件
- 四年级科学《运动与摩擦力》说课课件
- 诉讼费退费确认表
- 全球变暖视野下中国与墨西哥的能源现状分析
- 新外研版八年级上册英语全册教案(教学设计)
- 2022年(高级)茶艺师职业资格考试参考题库-下(多选、判断题部分)
- 边坡安全施工组织方案
评论
0/150
提交评论