




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验四 区域填充算法的实现班级 08信计二 学号 64 姓名 刘辉 分数一、实验目的和要求:1、 理解区域的表示和类型;2、 能够正确区分四连通、八连通的区域;3、 了解填充函数、区域填充的实现原理;4、 了解掌握区域填充的各种算法(种子填充算法、扫描线算法、边填充算法等),并实现种子填充算法和扫描线算法;5、 用种子填充算法实现四连同区域和八连通区域的填充,并观察他们之间的区别;6、 分析对比种子填充算法和扫描线算法实现的像素逼近效果和程序执行速度;二、实验原理: 用点阵方法表示的多边形区域,如果其内部像素具有同一种颜色,而边界像素具有另一种颜色,可以使用种子填充算法和扫描线算法等填充。种子填充算法是从区域内任一个种子像素位置(x,y)开始,由内向外将填充色扩散到整个多边形区域的填充过程;扫描线填充算法是当给定种子点(x,y)时,首先填充种子点所在扫描线上位于给定区域的一个区段,然后确定与这一段相连通的上、下两条扫描线上位于给定区域内的区段,并依次保存下来的过程。三、实验内容及步骤:3.1、实验内容:1. 利用种子算法实现内点表示的四连通区域的填充。如:设(x,y)为内点表示的四连通区域内的一点,oldcolor为区域的原色,要将整个区域填充为新的颜色newcolor;2. 利用扫描线算法实现以上区域的填充。如:填充以下图案,圆中填充蓝色,三角形中填充红色;3.2、实验步骤:种子填充算法的步骤:1. 种子入栈;2. 当栈非空时,进行下面的操作,否则结束;3. 栈顶元素出栈,如果是未填充的内部点,则将其填充,继续考察与其连通的点,若是为填充的内部点,则该点入栈,返回2步。扫描线填充算法的步骤:1. 初始化,置栈为空,将种子点(x,y)入栈。2. 出栈,若栈空则结束;否则取栈顶元素(x,y),以y作为扫描线。3. 填充并确定种子点所在区段,从种子点(x,y)出发,沿当前扫描线向左、右两个方向填充,直到边界。4. 确定新的种子点,在以上确定的边界中检查与当前扫描线y上、下相邻的两条扫描线上的像素。若存在非边界、未填充的像素,则把每一区间的最右像素作为种子点压入堆栈,返回2步。四、程序代码(1)、内点表示的四连通区域的种子递归填充算法(基于TurboC):#includevoid floodfill4(int x,int y,int oldcolor,int newcolor) if(getpixel(x,y)=oldcolor) putpixel(x,y,newcolor); delay(2000); floodfill4(x,y+1,oldcolor,newcolor); floodfill4(x,y-1,oldcolor,newcolor); floodfill4(x-1,y,oldcolor,newcolor); floodfill4(x+1,y,oldcolor,newcolor); main() int a,b,c,d,i,j; int graphdriver=DETECT; int graphmode=0; initgraph(&graphdriver,&graphmode, ); cleardevice(); setcolor(14); rectangle(250,250,300,300); for(i=251;i300;i+) for(j=251;j300;j+) putpixel(i,j,4); delay(1000); a=257; b=270; c=4; d=2; floodfill4(a,b,c,d); getch(); closegraph();(2)、内点表示的八连通区域的种子递归填充算法的调用函数:void floodfill8(int x,int y,int oldcolor,int newcolor) if(getpixel(x,y)=oldcolor) putpixel(x,y,newcolor); delay(2000); floodfill8(x,y+1,oldcolor,newcolor); floodfill8(x,y-1,oldcolor,newcolor); floodfill8(x-1,y,oldcolor,newcolor);floodfill8(x+1,y,oldcolor,newcolor);floodfill8(x+1,y+1,oldcolor,newcolor); floodfill8(x+1,y-1,oldcolor,newcolor); floodfill8(x-1,y+1,oldcolor,newcolor); floodfill8(x-1,y-1,oldcolor,newcolor); (3)、内点表示的四连通区域的扫描线填充算法(基于Vc+):#include#include#include #define MaxSize 100typedef struct int x; int y;Seed,ElemType;typedef struct ElemType dataMaxSize;int top;/栈顶指针 SqStack;void InitStack(SqStack *&s)s=(SqStack *)malloc(sizeof(SqStack);s-top=-1;int StackEmpty(SqStack *s)return(s-top=-1);int Push(SqStack *&s,ElemType e)if (s-top=MaxSize-1)return 0;s-top+;s-datas-top=e;return 1;int Pop(SqStack *&s,ElemType &e)if (s-top=-1)return 0;e=s-datas-top;s-top-;return 1;void ScanLineFill4(int x,int y,int oldcolor,int newcolor) int xl,xr,i; bool spanNeedFill; Seed pt,e; SqStack *s; InitStack(s); pt.x=x;pt.y=y; Push(s,pt); while(!StackEmpty(s) Pop(s,e); y=e.y; x=e.x; while(getpixel(x,y)=oldcolor) putpixel(x,y,newcolor); Sleep(1); x+; xr=x-1; x=pt.x-1; while(getpixel(x,y)=oldcolor) putpixel(x,y,newcolor); Sleep(1); x-; xl=x+1; x=xl; y=y+1; while(x=xr) spanNeedFill=FALSE; while(getpixel(x,y)=oldcolor) spanNeedFill=TRUE; x+; if(spanNeedFill) pt.x=x-1;pt.y=y; Push(s,pt); spanNeedFill=FALSE; while(getpixel(x,y)!=oldcolor&x=xr) x+; x=xl; y=y-2; while(x=xr) spanNeedFill=FALSE; while(getpixel(x,y)=oldcolor) spanNeedFill=TRUE; x+; if(spanNeedFill) pt.x=x-1;pt.y=y; Push(s,pt); spanNeedFill=FALSE; while(getpixel(x,y)!=oldcolor&x=xr) x+; void main() int a,b,c,d,i,j; int graphdriver=DETECT; int graphmode=0; initgraph(&graphdriver,&graphmode, ); cleardevice(); setfillstyle(RGB(255,255,255); setcolor(RED); int points=320,200,270,290,370,290; fillpoly(3,points); circle(320,240,160); a=RGB(255,255,255); b=RGB(255,0,0); ScanLineFill4(320,240,a,b); c=RGB(0,0,0); d=RGB(0,0,255); ScanLineFill4(320,180,c,d); getch(); closegraph();五、实验结果及分析(1)、实验结果:1、2、3、该算法实现了带孔图案的填充(2)实验分析:1. 种子填充算法适合于已经画出大量边界线的场合,适合于人机交互操作方式,或者事先保留了种子点,是最常用的是递归和扫描线的填充算法。2. 区域的连通方式对填充结果会产生影响。3. 区域填充的种子递归算法原理和程序都很简单,但由于多次递归,费时、费力、费内存,效率不高。为了减少递归次数,提高效率,可以采用扫描线算法。4. 扫描线算法减少了每个像素的访问次数,所需堆栈深度较浅,每次递归填充一行像素点,因而速度较快。5. 扫描线算法适用于边界定义的区域,四连通边界定义区域既可以是凸的,也可以是凹的,还可以是有孔的。六、实验总结在实
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版室内设计师离职保密及客户信息保护合同
- 2025年二手房交易定金及房屋维修基金缴纳协议
- 2025版桩基工程劳务分包与施工进度控制合同
- 2025年防水施工质量检测与分包合同
- 2025第二行政小区居民楼道清洁与安全巡查合同
- 海南省临高县2025年上半年公开招聘村务工作者试题含答案分析
- 2025版高端住宅售房协议范本及细则
- 2025版商业物业服务与绿色建筑认证合同
- 贵州省织金县2025年上半年公开招聘城市协管员试题含答案分析
- 2025电商运营入职合同范本:试用期规定及转正流程
- 2025年心理辅导:声音疗愈《听听声音》课件设计
- 2025年七年级上册生物知识点总结样本(2篇)
- 变化与更新-2025中国家居家装行业发展研究报告-树懒生活fine-202501
- 丹毒的健康宣教
- 主要施工机械设备、劳动力、设备材料投入计划及其保证措施
- 《柴油机的维护保养》课件
- 4S店企业职业卫生培训
- 石油化工设备维护与检修手册
- 拆迁工程成本控制方案
- 原发性肝癌的CT表现和诊疗
- 竞选竞选大学心理委员参考课件
评论
0/150
提交评论