c++实现种子填充算法
董世浩编辑:
QQ:2801081173
说明:在vs2017平台实现的种子填充算法
一、案例描述
种子填充算法假设在多边形或区域内部至少有一个像素是已知的。然后设法找到区域内所有其他像素,并对它们进行填充。区域可以用内部定义或边界定义。
如果是内部定义,那么,区域内部所有像素具有同一种颜色或值,而区域外的所有像素具有另一种颜色或值,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y6jmoXwU-1606302352149)(C:\Users\dsh\Desktop\董世浩2018904237(计算机图形学)\20181105174800577.png)]
知识点:
扫描线、鼠标事件响应
二、实现步骤
种子像素压入堆栈
当堆栈非空时
从堆栈中弹出一个像素
将该像素置成所要求的值
检查每个与当前像素邻接的4连通像素是否是边界像素或者是否已置成所要求的值。
若是上述两种情况之一, 则略而不计。否则把该像素压入堆栈。
三、实现原理
从包含种子像素的堆栈中弹出区段的种子像素
沿着扫描线对包含种子像素的区段左右像素进行填充,直至遇到边界像素为止,从而填满包含种子像素的区段。
区段内最左的和最右的像素记为Xleft和Xright。
在Xleft<=x<=Xright范围内,检查与当前扫描线相邻的上下两条扫描线是否全为边界像素或者前面已经填充过的像素。
如果这些扫描线既不包括边界元素,也不包括已填充的像素,那么在Xleft<=x<=Xright中把每一个区段的最右像素取做种子像素并压入堆栈
四、实现算法
直线种子填充算法完整代码:
#include <graphics.h>
#include <iostream>
#include<windows.h>
using namespace std;
//种子填充算法四联通算法
int BoundaryFill(int x, int y, int colorc)
{
static int flag = 0;
if (x >= 400 || x <= 0 || y >= 300 || y <= 0)
{
MessageBox(NULL, L"点击图形内部", L"提示", 1);
flag = 1;
return 0;
}
if (flag == 0)
{
int c = 0;
c = getpixel(x, y);
if (c != colorc)
{
putpixel(x, y, colorc);
}
if (c == colorc)
return 0;
Sleep(1);
BoundaryFill(x + 1, y, colorc);
BoundaryFill(x, y + 1, colorc);
BoundaryFill(x - 1, y, colorc);
BoundaryFill(x, y - 1, colorc);
}
}
int main()
{
initgraph(400, 300);
IMAGE img;
loadimage(&img, L"C://Users//dsh//Desktop//22.bmp", 400, 300); // 读取图片到 img 对象中
putimage(0, 0, &img); // 在坐标 (0, 0) 位置显示 IMAGE 对象
int xclick = 0;
int yclick = 0;
MOUSEMSG m;
int color[2];
color[0] = WHITE;//背景色
color[1] = BLACK;//图形色
while (true)
{
m = GetMouseMsg();
switch (m.uMsg)
{
case WM_LBUTTONDOWN:
xclick = m.x;
yclick = m.y;
BoundaryFill(xclick, yclick, color[1]);//种子填充算法
break;
case WM_RBUTTONUP:
return 0; // 按鼠标右键退出程序
}
}
getchar();
closegraph();
return 0;
}
五、实现效果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B1pSwkP5-1606302352153)(C:\Users\dsh\Desktop\董世浩2018904237(计算机图形学)\种子填充.gif)]
六、总结
getchar();
closegraph();
return 0;
}
### 五、实现效果
[外链图片转存中...(img-B1pSwkP5-1606302352153)]
### 六、总结
在老师发了本次作业后,我最开始看了关于MFC实现的相关程序,仔细阅读完程序后,我就准备使用一个graphics.h的函数进行实现,通过window窗口来展示出一个动态的种子填充算法,实现种子堆栈的相关操作。