实验四 区域填充算法的实现
班级 08信计2班 学号 20080502082 姓名 分数
一、实验目的和要求:
1、理解区域的表示和类型。 2、能正确区分四连通和八连通的区域 3、了解区域填充的实验原理。 4、利用C++实现区域填充的递归算法。
二、实验内容:
1假设在多边形内有一像素已知,由此出发利用连通性找到区域内所有像素。
2 取(x,y)为种子点将整个区域填充为新的颜色。 3 进行递归填充。
三、实验结果分析
区域填充属性包括填充样式,填充颜色和填充图案的类型。C语言中定义了某种图形后,即可调用-floodfill函数,对指定区域进行填充 . 程序代码
#define pi 3.141592
#define MAX(a,b) (a>b)? a:b #define MIN(a,b) (a
int ymax; float x;
float delat;
struct edge * pedge; };
struct point{
int x; int y;} ;
struct et { struct edge * pedge; int n;};
struct edge g_aet[10]; struct edge dge[10];
struct et g_et[10];
struct point point1,point2;
int ZUO(float x) { if((int)x==x) return (int)x; return (int)x+1; }
int YOU(float x) { if((int)x==x) return (int)x-1; return (int)x; }
int k=400,l=0;
void draw1() {
int i,t,j,a,c,p,z; float b; struct edge temp; for(i=k;i<=l;i++) {
a=0;
for(t=0;t<=9;t++)
{ if(g_et[t].n==i) break;}
for(j=0;j<=9;j++)
{ if(g_aet[j].ymax==0) break;}
if(t!=10){ g_aet[j].ymax=g_et[t].pedge->ymax; g_aet[j].x=g_et[t].pedge->x;
g_aet[j].delat=g_et[t].pedge->delat; if(g_et[t].pedge->pedge!=0) {
g_aet[j+1].ymax=g_et[t].pedge->pedge->ymax; g_aet[j+1].x=g_et[t].pedge->pedge->x;
g_aet[j+1].delat=g_et[t].pedge->pedge->delat; }
}
for(j=0;j<=9;j++)
{ if(g_aet[j].ymax==0) break; } j--;
for(t=0;t<=j;t++)
{ for(z=0;z<=j-1;z++)
{
if(g_aet[z].x>g_aet[z+1].x)
{ temp.ymax=g_aet[z].ymax; temp.x=g_aet[z].x;
temp.delat=g_aet[z].delat;
g_aet[z].ymax=g_aet[z+1].ymax; g_aet[z].x=g_aet[z+1].x;
g_aet[z].delat=g_aet[z+1].delat; g_aet[z+1].ymax=temp.ymax; g_aet[z+1].x=temp.x;
g_aet[z+1].delat=temp.delat; } } }
for(j=0;j<=9;j++)
{ if(g_aet[j].ymax==0) break; } j--; for(p=0;p<=j;p++) { a++;
if(a%2!=0)b=g_aet[p].x; else {
for(c=ZUO(b);c<=YOU(g_aet[p].x);c++)
putpixel(c,i,2);}
}
for(t=0;t<=j;t++)
{ if(g_aet[t].ymax==(i+1)) { g_aet[t].ymax=0; g_aet[t].x=0; g_aet[t].delat=0; }
g_aet[t].x+=g_aet[t].delat; }
for(t=0;t<=j;t++)
{ for(z=0;z<=j-1;z++)
{
if(g_aet[z].x { temp.ymax=g_aet[z].ymax; temp.x=g_aet[z].x; temp.delat=g_aet[z].delat; g_aet[z].ymax=g_aet[z+1].ymax; g_aet[z].x=g_aet[z+1].x; g_aet[z].delat=g_aet[z+1].delat; g_aet[z+1].ymax=temp.ymax; g_aet[z+1].x=temp.x; g_aet[z+1].delat=temp.delat; } } } } } void generate() { int i,y,n=1,m,q,p;float x; for(i=0;i<=9;i++) { if(n==1) { point2.x=point1.x=300; point2.y=point1.y=200; n++; } else { if(n%2==0) { x=40*cos(i*pi/5)+200; y=40*sin(i*pi/5)+200; } else { x=100*cos(i*pi/5)+200; y=100*sin(i*pi/5)+200; } if(point1.y==y) { n++; continue;} m=MIN(point1.y,y); if(x==point1.x) { dge[i-1].delat=0; dge[i-1].ymax=MAX(point1.y,y); dge[i-1].x=x; dge[i-1].pedge=0; for(q=0;q<=9;q++) { if(g_et[q].n==m) break;} if(q==10) { g_et[i-1].pedge=&dge[i-1]; g_et[i-1].n=m; } else { g_et[q].pedge->pedge=&dge[i-1]; g_et[i-1].n=0; } } else { dge[i-1].delat=(float)(x-point1.x)/(y-point1.y); dge[i-1].ymax=MAX(point1.y,y); if(point1.y>y) dge[i-1].x=x; else {dge[i-1].x=point1.x; }