收藏 分享(赏)

种子填充.doc

上传人:hwpkd79526 文档编号:7216599 上传时间:2019-05-10 格式:DOC 页数:4 大小:28KB
下载 相关 举报
种子填充.doc_第1页
第1页 / 共4页
种子填充.doc_第2页
第2页 / 共4页
种子填充.doc_第3页
第3页 / 共4页
种子填充.doc_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

1、0一、实验目标1) 通过实验,进一步了解和掌握几种常用多边形种子填充算法的基本原理2) 熟练掌握种子填充算法和区域图案填充的基本过程3) 掌握在 C/C+环境下用多边形种子填充算法编程实现指定多边形的填充二、实验内容一、实验内容1. 在给定的程序模板中添加递归种子填充、简单种子填充、扫描线种子填充,区域图案填充的功能,生成新的程序窗口中要有递归种子填充、简单种子填充、扫描线种子填充,区域图案填充的菜单按钮,点击按钮分别出现递归种子填充、简单种子填充、扫描线种子填充,区域图案填充的窗口,点击鼠标左键实现在窗口任意位置填充;2. 在理解递归种子填充、简单种子填充、扫描线种子填充,区域图案填充的原理

2、,使用 VC 实现递归种子填充、简单种子填充、扫描线种子填充,区域图案填充程序的编写,并最终在 MFC 上演示出来。2、实验原理 种子填充算法又称为边界填充算法。其基本思想是:从多边形区域的一个内点开始,由内向外用给定的颜色画点直到边界为止。如果边界是以一种颜色指定的,则种子填充算法可逐个像素地处理直到遇到边界颜色为止。种子填充算法常用四连通域和八连通域技术进行填充操作。1.递归种子填充算法原理种子填充算法是区域填充的一种重要基本方法,它假设在多边形内有一像素已知,由此出发利用连通性找到区域内的所有像素。递归种子填充算法的基本思想:设(x,y)是内点表示的一区域 G 内的一点,先取( x,y)

3、点为种子点,测试其颜色,若不等于边界颜色,说明是区域内一点,则将其置为新的颜色 newcolor,否则说明该点不在区域 G 内,则停止填充;然后将该点周围的四个点(四连通)或八个点(八连通)作为新的种子点进行同样的处理,通过这种扩散完成对整个区域的填充。2.简单种子填充算法原理简单种子填充算法,其基本思想:从多边形区域的一个内点开始,由内向1外用给定的颜色画点知道边界颜色为止。如果边界是以一种颜色指定的,则简单种子填充算法可逐个像素地处理知道遇到边界色为止。算法具体实现如下:(1)初始化:堆栈置空,将种子点入栈;(2)栈顶像素出栈;(3)将出栈像素设置成多边形色;(4)按左上右下的顺序检查与出

4、栈像素相邻的四个像素,若其中某个像素不在边界且未设置成多边形色,则把该像素入栈;(5)返回第(2)步3.扫描线种子填充算法原理该算法思想:首先填充种子所在扫描线上的连续区段;然后确定与这一区段相邻的上下两条扫描线上位于该区段内是否存在需要填充的新区段,如果存在,则依次把它们保存起来,反复这个过程,直到所保存的各区段都填充完毕。算法具体实现如下:(1)初始化:堆栈置空,将种子点(x,y)入栈;(2)出栈:若栈空则结束,否则取栈顶元素(x,y),以 y 作为当前扫描线;(3)填充并确定种子点所在区段:从种子点(x,y)出发,沿当前扫描线向左、右两个方向填充,直到边界。分别标记区段的左、右两个端点坐

5、标为 xl 和 xr;(4)确定新的种子点:在区间xl,xr中检查与当前扫描线 y 上、下相邻的两条扫描线上的像素。若存在非边界、未填充的的像素,则把每一个区间的最右像素作为种子点压入堆栈,返回第(2)步。4.区域图案填充算法原理区域图案填充就是用图案来填充平面区域,在确定了区域内点后,不是马上对该像素填色,而是先将该像素映射到图案位图的对应位置。根据图案上对应位置的像素值,决定填充颜色。填充方式有透明方式和不透明方式,图案填充方式有相对定位法和绝对定位法。三、实验步骤本次实验步骤1.添加菜单21)找到资源视图, 找到 Menu, 并点开 IDR_MAINFRAME;2)基本图形生成中,加入递

6、归种子填充菜单;3)右键递归种子填充菜单,选择添加事件处理程序;2转到头文件中 drawstyle 的定义,在枚举中添加 Seedfill4;3在 void CcgdemoView:OnDraw(CDC* pDC)中定义填充的颜色,初始颜色。4在 OnLButtonDown 类中加入 Seedfill4 的响应;5在 OnRButtonDown 类中加入 Seedfill4 的响应;6在事件处理响应中将按钮对应到响应的函数中;7构建处理函数8void CcgdemoView:Seedfill4(CDC* pDC,int x,int y,int boundarycolor,int newcolo

7、r)其他的都类似四、实验遇到的问题及其解决方法(重点)1当填充的背景颜色和边界颜色不同时,会产生只能填充一半的问题,然后我将填充的背景颜色和边界颜色设置为同一种颜色就可以了;2 完成程序编写调试之后,运行程序,在生成的画图窗口基本图形生成下拉菜单下没有发现递归种子填充的菜单按钮;错误提示 void CcgdemoView:Seedfill4(CDC* pDC,int x,int y,int boundarycolor,int newcolor)中没有重载变量,后经检查发现 void CcgdemoView:onSeedfill4(CDC* pDC,int x,int y,int boundar

8、ycolor,int newcolor)中多写了 on,应该是 void CcgdemoView:Seedfill4(CDC* pDC,int x,int y,int boundarycolor,int newcolor);3 在扫描线填充中,运行程序时出现无调试信息,即无法找到“cgdemo.exe”的调试信息,或者调试信息不匹配,在同学的帮助下删除;4afx_msg void OnSaomiaofill()5ON_COMMAND(ID_SaoMiaoFill, Invalidate(true);,完成了程序的运行;7 在区域图案填充中,运行程序后,在生成的画图窗口中,点击区域图3案填充菜单按钮后,进行按钮填充没有出现图案填充,而是还是递归种子填充,经检查发现,递归函数写成了 Seedfill4,而应该是 Quyu。5、 实验结论和收获种子填充算法的优点是非常简单,缺点是需要大量栈空间来存储相邻的点。扫描线填充算法就是它的改进的方法。它是通过沿扫描线填充水平像素段,来处理四连通或八连通相邻点,这样就仅仅只需要将每个水平像素段的起始位置压入栈,而不需要将当前位置周围尚未处理的相邻像素都压入栈,从而可以节省大量的栈空间。

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报