实验四 区域填充算法的实现
- 格式:doc
- 大小:50.00 KB
- 文档页数:8
实验四区域填充算法的实现
班级 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
#include "graphics.h"
#include "math.h"
struct edge {
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++;