扫描线填充算法与种子填充算法的区别是啥
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了扫描线填充算法与种子填充算法的区别是啥相关的知识,希望对你有一定的参考价值。
参考技术A 种子优点是非常简单,缺点是需要大量栈空间来存储相邻的点。改进的方法就是:通过沿扫描线填充水平像素段,来处理四连通或八连通相邻点,这样就仅仅只需要将每个水平像素段的起始位置压入栈,而不需要将当前位置周围尚未处理的相邻像素都压入栈,从而可以节省大量的栈空间。
图形填充之种子填充算法
算法说明:
栈结构实现4-连通边界填充算法的算法步骤为:
种子象素入栈;当栈非空时重复执行如下三步操作:
(a)栈顶象素出栈;
(b)将出栈象素置成填充色;
(c)检查出栈象素的4-邻接点,若其中某个象素点不是边界色且未置成多边形色,则把该象素入栈。
点评:代码写的比较遭,用的是c,但是也掺入了c++的模板和STL,水平还是欠缺,且图中种子事先固定(100,100),最大的缺点是该算法效率较低
代码
1 // 种子区域填充算法.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include<stdio.h> 6 #include"graphics.h" 7 #include<stdlib.h> 8 #include<stack> 9 10 using namespace std; 11 12 //定义结构体存储像素坐标 13 struct Point 14 { 15 int x; 16 int y; 17 }; 18 19 //函数声明 20 void Boundaryfilling(Point a[], int n); 21 void judgecolor(int x, int y, stack<int> &sx, stack<int> &sy); 22 23 int main() 24 { 25 int gdriver = DETECT, gmode, n, i; 26 27 printf("please input number of point:\\n"); 28 scanf_s("%d", &n); 29 30 Point *p=(Point *)malloc(n*sizeof(Point)); //动态分配内存 31 32 printf("please input point :\\n"); 33 for (i = 0; i < n; i++) 34 scanf_s("%d%d", &p[i].x, &p[i].y); 35 36 initgraph(&gdriver, &gmode, ""); 37 38 setcolor(BLUE); 39 setbkcolor(BLACK); 40 41 //画出多边形 42 for (i = 0; i < n-1; i++) 43 line(p[i].x, p[i].y, p[i + 1].x, p[i + 1].y); 44 45 Boundaryfilling(p, n); 46 47 system("pause"); 48 closegraph(); 49 50 return 0; 51 } 52 53 void Boundaryfilling(Point a[], int n) 54 { 55 stack<int> sx,sy; 56 int x=0 , y=0 ,x0,y0,i; 57 58 for (i = 0; i < n; i++) 59 { 60 x += a[i].x; 61 y += a[i].y; 62 } 63 64 x = x / (n-1); 65 y = y / (n-1); 66 67 sx.push(x);//x坐标入栈 68 sy.push(y);//y坐标入栈 69 70 while (!sx.empty()) //判断栈是否为空 71 { 72 x0 = sx.top(); 73 y0 = sy.top(); 74 75 putpixel(sx.top(), sy.top(), YELLOW); //栈顶元素着色 76 sx.pop();//栈顶元素出栈 77 sy.pop();//栈顶元素出栈 78 79 judgecolor(x0 - 1, y0, sx, sy);//左边点 80 judgecolor(x0 + 1, y0, sx, sy);//右边点 81 judgecolor(x0, y0 - 1, sx, sy);//下边点 82 judgecolor(x0, y0 + 1, sx, sy);//上边点 83 } 84 } 85 86 //判断该像素是否没有着色 87 void judgecolor(int x, int y,stack<int> &sx,stack<int> &sy) 88 { 89 if (getpixel(x, y) == BLACK) 90 { 91 sx.push(x); 92 sy.push(y); 93 } 94 }
效果图
以上是关于扫描线填充算法与种子填充算法的区别是啥的主要内容,如果未能解决你的问题,请参考以下文章
LinuxUbuntu20.04平台安装Clion与OpenGL并实现图形算法--区域填充扫描线算法
LinuxUbuntu20.04平台安装Clion与OpenGL并实现图形算法--区域填充扫描线算法