【文件属性】:
文件名称:VC++实现多边形填充
文件大小:8KB
文件格式:CPP
更新时间:2012-07-14 19:44:31
计算机图形学 多边形填充 扫描线填充 Bresenham算法 四连通种子填充
#include
#include
#include
#include
#include
//////////////////////////////////////////////////////////////functions/////////////////////////////////////////////////
void swap(float &m,float &n)
{
float temp=n;
n=m;
m=temp;
}
int sign(float a,float b)//sign()
{
int t;
if(a>b)
{
t=1;}
else if(adx)
{
swap(dx,dy);
Flag=1;
}
else
Flag=0;
float Nerror=2*dy-dx;
for(int i=1;i=0)
{
if(Flag)
{
x=x+sx;}
else
y=y+sy;
Nerror=Nerror-2*dx;
}
if(Flag)
{
y=y+sy;}
else
x=x+sx;
Nerror=Nerror+2*dy;
}
}
///////////////////////////////////四连通种子填充///////////////////////////////////////////////////
void BoundaryFill4(HDC hdc,int x,int y,int FilledColor,int BoundaryColor)
{
int CurrentColor;
CurrentColor=GetPixel(hdc,x,y);
if(CurrentColor!=BoundaryColor&&CurrentColor!=FilledColor)
{
SetPixel(hdc,x,y,FilledColor);
BoundaryFill4(hdc,x+1,y,FilledColor,BoundaryColor);
BoundaryFill4(hdc,x-1,y,FilledColor,BoundaryColor);
BoundaryFill4(hdc,x,y+1,FilledColor,BoundaryColor);
BoundaryFill4(hdc,x,y-1,FilledColor,BoundaryColor);
}
}
////////////////////////////////////////扫描线填充///////////////////////////////////////////////////
//DrawLine()函数:在(x1,y)和(x2,y)两点之间画一条颜色为FilledColor的横线(用来扫描填充)
void drawline(HDC hdc, int x1, int x2,int y0, int FilledColor)
{
for(int n=x1+1;n500))
{a[j][1]=i;}
}
}
//利用循环调用DrawLine函数逐行填充两交点之间的点
for(int k=0;k<300;k++)
{ if((a[k][0]!=0)&&(a[k][1]!=0))
drawline(hdc,a[k][0],a[k][1],k,RGB(255,0,0));}
}
///////////////////////////////////////////////边界填充//////////////////////////////////////
//Contrary()取反函数:如果点的颜色为白,则将点置为填充色;如果点的颜色为填充色,则将点置为白色
//忽略了边界色,即不对边界点作颜色处理
void contrary(HDC hdc, int x, int y,int FilledColor)
{
for(int h=x;h<280;h++)
{
if(GetPixel(hdc,h,y)==RGB(255,255,255))
{
SetPixel(hdc,h,y,FilledColor);
}
else if(GetPixel(hdc,h,y)==FilledColor)
{
SetPixel(hdc,h,y,RGB(255,255,255));
}
}
}
//borderline()边线函数: 先找出图形的边界 左边和右边,从右到左的顺序调用contrary()函数进行填充
void borderline(HDC hdc, int boundarycolor)
{
for(int j=280;j<499;j++)
{
for(int i=80;i<280;i++)
{
int currentcolor=GetPixel(hdc,i,j);
//排除了边界水平的情况,即(x-1,y)、(x,y)和(x+1,y)连续三点都是边界点的点不参与填充
if((currentcolor==boundarycolor)&&(GetPixel(hdc,i+1,j)!=boundarycolor)&&(GetPixel(hdc,i-1,j)!=boundarycolor)&&(i>100))
{
contrary(hdc,i,j,RGB(0,0,255));
}
}
}
for(int m=280;m<499;m++)
{
for(int n=80;n<280;n++)
{
int currentcolor=GetPixel(hdc,n,m);
if((currentcolor==boundarycolor)&&(GetPixel(hdc,n+1,m)!=boundarycolor)&&(GetPixel(hdc,n-1,m)!=boundarycolor)&&(n<101))
{
contrary(hdc,n,m,RGB(0,0,255));
}
}
}
}