正文

扫描线种子填充算法2007-12-20 08:01:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/tld5yj/31505.html

分享到:

这就是扫描线种子填充程序的C实现,运行后将出现一个多边形和一个种子,由于仅是模拟,所以初始化时固定了多边形的位置和种子的位置,可以在代码中修改其位置后重新编译运行,运行时请在main()函数里设置好图形驱动程序路径,因人而异了。

#include<graphics.h>
#include<stdio.h>
#include<malloc.h>
#define bordercolor 15
#define backcolor 0
#define seedcolor 4
#define fillcolor 10

typedef struct Point
{int x;
 int y;
}point;

typedef struct Stack
{point *base;
 point *top;
}*stack;

void initstack(stack s)
{(*s).base=(point*)malloc(sizeof(point));
 if(!(*s).base)exit(1);
 (*s).top=(*s).base;
}

void push(stack s,point p)
{*((*s).top)=p;
 (*s).top++;
}

int stackempty(stack s)
{if((*s).top==(*s).base)return(1);
 else return(0);
}

point pop(stack s)
{(*s).top--;
 return(*((*s).top));
}

void drawgraphics()
{rectangle(100,100,539,299);
 rectangle(150,150,489,249);
}

point produceseed()
{point p;
 p.x=125;
 p.y=200;
 return(p);
}

void intostack(stack s,int y0,int xl,int xr)
{int x,y;
 point tm;
 for(x=xl,y=y0;x<=xr&&x<getmaxx();x++)
 {if((x!=xr&&getpixel(x,y)==backcolor&&getpixel(x+1,y)!=backcolor)||

(x==xr&&getpixel(x,y)==backcolor))
  {tm.x=x;
   tm.y=y;
   push(s,tm);
   putpixel(x,y,seedcolor);
  }
  if(x==xr&&getpixel(x,y)==backcolor)break;
 }
}

void fillgraphics()
{int xl=0,xr=getmaxx(),x,y;
 point seed;
 stack s=NULL;
 seed=produceseed();
 putpixel(seed.x,seed.y,seedcolor);
 getch();
 initstack(s);
 push(s,seed);
 while(!stackempty(s))
 {seed=pop(s);
  for(x=seed.x,y=seed.y;getpixel(x,y)==backcolor||getpixel(x,y)==seedcolor;x++)
  {putpixel(x,y,fillcolor);
  }
  xr=x-1;
  for(x=seed.x-1,y=seed.y;getpixel(x,y)==backcolor||getpixel(x,y)==seedcolor;x

--)
  {putpixel(x,y,fillcolor);
  }
  xl=x+1;
  intostack(s,seed.y+1,xl,xr);
  intostack(s,seed.y-1,xl,xr);
  getch();
 }
}

main()
{int driver=DETECT,mode;
 registerbgidriver(EGAVGA_driver);
 initgraph(&driver,&mode,"");
 drawgraphics();
 fillgraphics();
 outtextxy(180,20,"Scanline filling graphics finished!");
 getch();
 closegraph();
}

阅读(9230) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册