求一个C语言实现的种子填充多边形算法程序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求一个C语言实现的种子填充多边形算法程序相关的知识,希望对你有一定的参考价值。
求一个C语言实现的种子填充算法程序 要求: 1,用TC调试、要能通过、 2,百度、谷歌里面复制的就不用了哈、那些都不能运行、 3,高手最好能写点注释上去、 4,最后感激你、、、、
参考技术A /*如果是用线填充,程序如下。如果是用点填充需要用到堆栈和系统底层库函数或者用画点函数putpixel()。 下面实例是用扫描线填充长方形,开始要输入长方形的左上顶点坐标和右下顶点坐标以及填充扫描线的间距(>=1),如果间距等于1,就是完全填充(实填充)。 一个完整的c程序如下,程序在win-tc和tc2.0下都调试通过。 */ #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<graphics.h> void draw(int x1,int y1,int x2,int y2,int delta) int nx1,ny1,nx2,ny2; nx1=x1,ny1=y2-delta,nx2=x1+delta,ny2=y2; while((ny1>=y1)&&(nx2<=x2)) line(nx1,ny1,nx2,ny2); ny1-=delta; nx2+=delta; if(nx2>x2) ny2-=nx2-x2; nx2=x2; while(ny1>y1) line(nx1,ny1,nx2,ny2); ny1-=delta; ny2-=delta; nx1+=y1-ny1; ny1=y1; while(nx1<x2) line(nx1,ny1,nx2,ny2); nx1+=delta; ny2-=delta; else nx1+=y1-ny1; ny1=y1; while(nx2<x2) line(nx1,ny1,nx2,ny2); nx2+=delta; nx1+=delta; ny2-=nx2-x2; nx2=x2; while(ny2>y1) line(nx1,ny1,nx2,ny2); ny2-=delta; nx1+=delta; int main(void) int x1,y1,y2,x2,delta; int driver=DETECT,mode; printf("Please input lefttop(x1,y1) and rightbottom(x2,y2) of rectangle and delta:\n"); scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&delta); initgraph (&driver,&mode,"C:\\TC"); /*这里*/ rectangle(x1,y1,x2,y2); draw(x1,y1,x2,y2,delta); gotoxy(1,1); printf("Press any key to exit!"); getch(); closegraph(); return 0; /*说明:将main()函数中的initgraph(&gdriver,&gmode,"");中的""更改为你的TC安装目录,一般tc必须安装在c盘根目录下,所以就是initgraph(&gdriver,&gmode,"C:\\TC");如你的TC安装目录为D盘的Tools目录下的TC目录,那么上述语句改为: initgraph(&gdriver,&gmode,"D:\\Tools\\TC"); 同时保证在D:\\Tools\\TC目录里有文件EGAVGA.BGI,万一不行,将本程序复制到你的TC安装目录下再运行。 */本回答被提问者采纳UVA 572 -- Oil Deposits(DFS求连通块+种子填充算法)
UVA 572 -- Oil Deposits(DFS求连通块)
图也有DFS和BFS遍历,由于DFS更好写,所以一般用DFS寻找连通块。
下述代码用一个二重循环来找到当前格子的相邻8个格子,也可用常量数组或者写8条DFS调用。
下述算法是:种子填充(floodfill)
两种连通区域
四连通区域:从区域内一点出发,可通过上、下、左、右四个方向的移动组合,在不越出区域的前提下,能到达区域内的任意像素
八连通区域:从区域内每一像素出发,可通过八个方向,即上、下、左、右、左上、右上、左下、右下移动的组合,在不越出区域的前提下,能到达区域内的任意像素。
基本原理
从多边形区域内部的某一像素点(称为种子)开始,由此出发找到区域内的其它所有像素。
采用的边界定义
区域边界上所有像素均具有某个特定的颜色值,区域内部所有像素均不取这一特定颜色,而边界外的像素则可具有与边界相同的颜色值。
算法的执行过程:
从(x,y)开始,先检测该点的颜色,若它与边界色和填充色均不相同,则用填充色填充该点。然后检测相邻位置,以确定它们是否是边界色和填充色,若不是,则填充该相邻点。直到检测完区域边界范围内的所有像素为止。
从当前点检测相邻像素的方法:四连通或八连通
从四个方向寻找下一个像素,称为四向算法(只能填充四连通区域);
从八个方向寻找下一个像素,称为八向算法(可以填充八连通区域和四连通区域)。
四连通区域的种子填充递归算法:
1 void ZhongZiTC4 (int seedx, int seedy, int fcolor, int bcolor) 2 { 3 int current = getpixel (seedx, seedy); 4 if ((current != bcolor) && (current != fcolor)) 5 { putpixel (seedx, seedy, fcolor); 6 ZhongZiTC4 (seedx+1, seedy, fcolor, bcolor); //右 7 ZhongZiTC4 (seedx–1, seedy, fcolor, bcolor); //左 8 ZhongZiTC4 (seedx, seedy+1, fcolor, bcolor); //上 9 ZhongZiTC4 (seedx, seedy–1, fcolor, bcolor); //下 10 } 11 }
UVA 572代码:
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 const int maxn = 100+5; 5 char deposits[maxn][maxn]; 6 int id[maxn][maxn]; 7 int rm,cm; 8 void dfs(int r,int c,int cnt) 9 { 10 ///判断是否出界 11 if(r<0 || r>=rm || c<0 || c>=cm) return; 12 ///临界条件 13 if(deposits[r][c] == \'*\') return; 14 if(id[r][c]) return; 15 16 id[r][c] = cnt; 17 for(int i=-1;i<=1;i++) 18 for(int j=-1;j<=1;j++) 19 if(i!=0 || j!=0) dfs(r+i,c+j,cnt); 20 21 } 22 23 int main() 24 { 25 26 while(cin>>rm>>cm && rm && cm) 27 { 28 for(int i=0;i<rm;i++) cin>>deposits[i]; 29 int cnt=0; 30 memset(id,0,sizeof(id)); 31 for(int i=0;i<rm;i++) 32 for(int j=0;j<cm;j++) 33 { 34 if(!id[i][j] && deposits[i][j]==\'@\')///没有编号 35 dfs(i,j,++cnt); 36 } 37 cout<<cnt<<endl; 38 39 } 40 return 0; 41 }
以上是关于求一个C语言实现的种子填充多边形算法程序的主要内容,如果未能解决你的问题,请参考以下文章