实验四:种子填充算法

4.1实验目的

掌握种子填充算法(递归算法)、改进的种子填充算法、扫描线种子填充算法

4.2实验内容

C++中编写函数
模板库的使用stack

4.3算法思路

所有种子填充算法的核心其实就是一个递归算法,都是从指定的种子点开始,向各个方向上搜索,逐个像素进行处理,直到遇到边界,各种种子填充算法只是在处理 颜色和边界的方式上有所不同。
边界填充算法与注入填充算法的本质其实是一样的,都是递归和搜索,区别只在于对边界的确认,也就是递归的结束条件不一样。注入填充算法没有边界的概念,只是对联通区域内指定的颜色进行替换,而边界填充算法恰恰强调边界的存在,只要是边界内的点无论是什么颜色,都替换成指定的颜色。边界填充算法在应用上也非常的广泛,画图软件中的“油漆桶”功能就是边界填充算法的例子。
扫描线种子填充算法的基本过程如下:当给定种子点(x, y)时,首先分别向左和向右两个方向填充种子点所在扫描线上的位于给定区域的一个区段,同时记下这个区段的范围[xLeft, xRight],然后确定与这一区段相连通的上、下两条扫描线上位于给定区域内的区段,并依次保存下来。反复这个过程,直到填充结束。

4.4流程图

(1)种子填充算法(递归算法)
(2)边界种子填充算法(改进)
(3)扫描线种子填充算法

4.5实验步骤

(1)种子填充算法(递归算法)
通过getpixel方法来获取点的颜色,判断其是否与原颜色相同,如果不相同,则变化其颜色为新的颜色,通过递归其4连通区域来达到有序在不越出区域的情况下,到达区域内的任意元素。
(2)边界种子填充算法(改进)
通过getpixel方法来获取点的颜色,判断其是否与原颜色相同而且是否与边界颜色相同,如果都不相同,则变化其颜色为新的颜色,通过递归其4连通区域来达到有序在不越出区域的情况下,到达区域内的任意元素。
(3)扫描线种子填充算法
1) 初始化一个空的栈用于存放种子点,将种子点(x, y)入栈;
2)判断栈是否为空,如果栈为空则结束算法,否则取出栈顶元素作为当前扫描线的种子点(x, y),y是当前的扫描线;
3) 从种子点(x, y)出发,沿当前扫描线向左、右两个方向填充,直到边界。分别标记区段的左、右端点坐标为xLeft和xRight;
4)分别检查与当前扫描线相邻的y - 1和y + 1两条扫描线在区间[xLeft, xRight]中的像素,从xLeft开始向xRight方向搜索,若存在非边界且未填充的像素点,则找出这些相邻的像素点中最右边的一个,并将其作为种子点压入栈中,然后返回第(2)步;

4.6实验代码

(1)在CLiHuchenView().h中添加代码:

public:void Draw();//添加画图成员CDC* mpDC;//定义指针void Scanseedfill(int x,int y,COLORREF oldColor,COLORREF newColor);//定义扫描线种子填充算法void FloodFill(int x, int y, COLORREF oldcolor, COLORREF newcolor);//定义递归种子填充算法void BoundaryFill(int x, int y, COLORREF oldcolor, COLORREF newcolor);//定义改进的种子填充算法

(2)在LiHuchenView.cpp中添加:

//引入种子库
#include "stack"
using namespace std;
extern stack<CPoint> s;

(3)在在LiHuchenView.cpp中的OnDraw()添加:

Draw();//添加画图函数

(4)添加函数

/*
-----------------------------------区域填充算法---------------------------------------
*/
/
//画图
/
void CLiHuchenView::Draw()
{CDC *pDC=GetDC();//定义指针mpDC=pDC;POINT ptpolygon1[6]={{600,50},{600,250},{700,250},{700,230},{620,230},{620,50}};//多边形坐标mpDC->Polygon(ptpolygon1,6);//绘制多边形// Scanseedfill(610,100,RGB(255,255,255),RGB(255,0,0));//扫描线种子填充算法
//  FloodFill(610,100,RGB(255,255,255),RGB(0,255,0));//递归种子填充算法BoundaryFill(610,100,RGB(0,0,0),RGB(0,0,255));//边界种子填充算法
}
/
//记录种子点
/
struct Seed
{int x;int y;
};/
//扫描线种子填充算法
/void CLiHuchenView::Scanseedfill(int x, int y, COLORREF oldColor, COLORREF newColor)
{stack<Seed> sp;//种子库int xl,xr;bool spanNeedfill;Seed pt;pt.x=x;pt.y=y;sp.push(pt);while(!sp.empty()){pt=sp.top();sp.pop();y=pt.y;x=pt.x;while(mpDC->GetPixel(x,y)==oldColor)//向右填充{mpDC->SetPixel(x,y,newColor);x++;}xr=x-1;x=pt.x-1;while(mpDC->GetPixel(x,y)==oldColor)//向左填充{mpDC->SetPixel(x,y,newColor);x--;}xl=x+1;//处理上面一条扫描线x=xl;y=y+1;while(x<=xr){spanNeedfill=false;while(mpDC->GetPixel(x,y)==oldColor){spanNeedfill=true;x++;}if(spanNeedfill){pt.x=x-1;pt.y=y;sp.push(pt);spanNeedfill=false;}while((mpDC->GetPixel(x,y)!=oldColor)&&x<=xr) x++;}//处理下面一条扫描线x=xl;y=y-2;while(x<=xr){spanNeedfill=false;while(mpDC->GetPixel(x,y)==oldColor){spanNeedfill=true;x++;}if(spanNeedfill){pt.x=x-1;pt.y=y;sp.push(pt);spanNeedfill=false;}while((mpDC->GetPixel(x,y)!=oldColor)&&x<=xr) x++;}}}/
//递归种子填充算法
/
void CLiHuchenView::FloodFill(int x, int y, COLORREF oldcolor, COLORREF newcolor)
{//判断当前颜色if (mpDC->GetPixel(x, y) == oldcolor){mpDC->SetPixel(x, y,newcolor); //修改颜色//寻找周围的临近点,递归FloodFill(x, y + 1, oldcolor, newcolor);FloodFill(x, y - 1, oldcolor, newcolor);FloodFill(x - 1, y, oldcolor, newcolor);FloodFill(x + 1, y, oldcolor, newcolor);}
}/
//改进的种子填充算法(边界填充)
/
void CLiHuchenView::BoundaryFill(int x, int y, COLORREF boundarycolor, COLORREF newcolor)
{//判断是否为边界颜色或者新的颜色//默认边界颜色为黑色if(mpDC->GetPixel(x, y) != boundarycolor &&mpDC->GetPixel(x, y) !=newcolor){mpDC->SetPixel(x, y, newcolor); //修改颜色//寻找周围的临近点,递归BoundaryFill(x, y + 1, boundarycolor, newcolor);BoundaryFill(x, y - 1, boundarycolor, newcolor);BoundaryFill(x - 1, y, boundarycolor, newcolor);BoundaryFill(x + 1, y, boundarycolor, newcolor);}}

4.7实验结果展示

(1)扫描线种子填充算法
(2)递归种子填充算法
(3)边界种子填充算法(改进的)

计算机图形学(四)—— 实验四:种子填充算法相关推荐

  1. 计算机图形Opengl的实验报告,计算机图形学OpenGL实验四.doc

    计算机图形学OpenGL实验四 实验报告 学院(系)名称: 姓名学号专业班级实验项目实验四:场景漫游课程名称计算机图形学课程代码实验时间实验地点批改意见成绩教师签字:实验环境(软.硬件环境) 实验目的 ...

  2. 计算机图形学有序边表作业,《计算机图形学》有序边表填充算法.docx

    实验报告 实验目的 1.掌握有序边表算法填充多边形区域; 2.理解多边形填充算法的意义: 3.增强C语言编程能力. 算法原理介绍 根据多边形内部点的连续性知:一条扫描线与多边形的交点中,入点和出点之间 ...

  3. 计算机图形学E4——OpenGL 区域种子填充

    其他计算机图形学实验见 链接 系统递归栈太慢了,用stack或者queue会好一点,本质一样,都是bfs //DFS 系统递归栈//#include<iostream> //#includ ...

  4. 活性边表算法c语言,《计算机图形学》有序边表填充算法.doc

    PAGE PAGE 8 实 验 报 告 实验目的 掌握有序边表算法填充多边形区域: 理解多边形填充算法的意义: 增强C语言编程能力. 算法原理介绍 根据多边形内部点的连续性知:一条扫描线与多边形的交点 ...

  5. c语言图形学扫描线填充算法,《计算机图形学》OpenGL实现扫描线填充算法

    顾名思义啊,就是在OpenGL中用扫描填充算法画一个稍微复杂的图形: #include #include #include #include #define COLOR_NEW 1.0,0.0,0.0 ...

  6. c语言 连通域算法 递归,VC++ 6.0编写计算机图形学中的种子填充算法,想用递归的八向连通域,求助!...

    VC++ 6.0编写计算机图形学中的种子填充算法,想用递归的八向连通域,求助!0 填充函数代码如下: void CComputerGraphicsView::PolygonFill2()//区域填充函 ...

  7. 种子填充算法----计算机图形学

    种子填充算法: 种子填充算法的基本思想是:从多边形区域的一个内点开始,由内向外用给定的颜色画点直到边界为止. 区域 可以由内部点或边界来定义,一般都采用边界定义,即区域边界上所有像素被置为特定值,而区 ...

  8. 图形学初步--------种子填充算法

    上篇博文讲到了填充算法的扫描线填充,这篇博文讲解另一大算法思路----------种子填充. 一.概念 种子填充算法假设在多边形或区域内部至少有一个像素是已知的.然后设法找到区域内所有其他像素,并对它 ...

  9. java实现种子填充算法,Java编写图形学的种子填充算法

    用C写的图形学填充算法已经很多了,看到不少帖子都是在问关于如何用Java编写图形学的填充算法,说来也巧,我刚好要做一个这个方面的实验,用的是扫描线种子填充算法,由于时间仓促,代码质量可能不算很高,希望 ...

  10. 计算机图形学(第四版)-第一个画线例子- 读书笔记P30

    说明:内容为计算机图形学(第四版)这本书的读书笔记,会记录这本书的一些编码知识和其他内容,目标:将厚书读薄yeah~ 1.OpenGL基本语法: 2.附加库: 3.OpenGL的安装和环境配置: 参考 ...

最新文章

  1. 1968年12月9日,恩格尔巴特公开演示了世界上第一个鼠标盒子
  2. Plant J:细菌挥发性物质和光合信号激活低铁响应途径
  3. “人工智能治理公共服务平台”在2020年中关村论坛发布
  4. html2canvas在Vue项目踩坑-生成图片偏移不完整
  5. java多态口诀,Java之路---Day12(多态),多态Java
  6. 2018明星学术公众号TOP 10重磅发布,PaperWeekly再度入选
  7. Android ActionBar随ScorllView上下拖动而透明度渐变效果
  8. Spring-Mybatis MapperScannerConfigurer 取不到PropertyPlaceholderConfigurer里的值
  9. [LeetCode] Minimum Depth of Binary Tree
  10. Docker配置Dockerfile中关键ENTRYPOINT和CMD命令详解
  11. 关于脏读,不可重复读,幻读的理解
  12. 史上最强的MSN聊天记录!
  13. oracle如何判断节假日,oracle function 用于判断是否为节假日
  14. limbo模拟器安装linux,limbo模拟器win10镜像安装使用教程(附下载)
  15. 小白也可以开发闲鱼自动化工具(自动找爆款)
  16. 纯CSS简单实现漂亮的timeline时间轴效果(样式1)
  17. 微慕小程序专业版V3.6.6发布
  18. ue4 unreal4 自定义网格 绘制自定义网格 绘制面 (Plus)
  19. iOS连wifi(修改密码后的wifi)遇到的坑,纯转载
  20. 我国信创行业迅速发展,IT产业等领域有望实现国产化

热门文章

  1. mybatis-plus中的select
  2. 大数据学情分析_大数据时代|如何轻松做好学情分析
  3. python暂停和恢复_Scrapy如何暂停/恢复工作?
  4. Java编程:java判断两个区间交差重叠
  5. Java编程:中缀表达式转后缀表达式
  6. Cesium:向地图中添加面的方法
  7. linux进程管理概念,Linux教程之进程的概念和进程管理命令的使用
  8. 那年,三支玫瑰的花语是我们每人一支
  9. Java API简介以及以及常用的类库介绍
  10. 三维重建-立体校正(Recitification)