
/*如果是用线填充,程序如下。如果是用点填充需要用到
堆栈和系统底层库函数或者用画点函数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安装目录下再运行。 */一、
种子填充算法思想:
首先填充种子所在的尚未填充的一区段,然后确定与这一区段相邻的上下两条扫描线上位于该区段内是否存在需要填充的新区段,如果存在,则依次把每个新区段最右端的象素作为种子放入堆栈。反复这个过程,直到堆栈为空。
二、种子填充算法步骤:
1、初始化堆栈。
2、种子压入堆栈。
3、While(堆栈非空)从堆栈d出种子象素。
编译能通过,但是执行出问题,或者执行的效果和自己想象的不一样,就需要调试。看看这个:
http://tieba.baidu.com/f?kz=779255997
希望对你有帮助。
评论列表(0条)