求一速度较快的图形填充算法。 请高手帮忙,谢谢。
解决方案 »
- 初学vc,不知道为什么rich edit control 这控件用不了?
- 请教高手,界面设计
- 动态链接库导出几个类,其中一个类提示:'class' type redefinition?
- 函数执行完毕返回值一般存放在哪里?
- 表是不断更新的,我定时读表,处理完需要把读到的部分删掉,保留新的部分,怎么处理?
- 请教:vc++做B/S程序需要学习那些东西?
- VC里面在某处打一个断点,然后DEBUG提示不能设置断点.怎么回事?
- 奇怪、奇怪、奇怪现象,我没招了,大虾们出出手,永世感激!
- winsock的接收问题
- 请问在一个dialog里面如何显示一个powerpoint文档?
- 如何让程序在Windows9X的"登陆网络"对话框出来之间运行?
- CEdit打开文件大小的问题,在线等!
{ //使用扫描线种子填充算法.
//先建立一个象素(坐标)栈.
int x,y,x0,xl,xr,yy,xx;
int tag;
CPoint ptemp,pt;
CDC *cdc;
cdc=GetDC();
COLORREF pcolor;
//cdc->SetPixel(point.x,point.y,color); //点亮圆心.
push(seed); //种子象素入栈.
while(top!=NULL) //象素栈非空
{
ptemp=pop(); //栈顶象素出栈
x=ptemp.x; y=ptemp.y;
cdc->SetPixel(x,y,color);
x0=x+1;
while((pcolor=cdc->GetPixel(x0,y))==bgcolor)
//pixel(x0,y)的值不等于边界值,填充右方象素.
{
cdc->SetPixel(x0,y,color);
x0++;
}
xr=x0-1;//最右象素.
x0=x-1;
//pt.x=x0; pt.y=y;
while((pcolor=cdc->GetPixel(x0,y))==bgcolor)
//pixel(x0,y)的值不等于边界值,填充左方象素.
{
cdc->SetPixel(x0,y,color);
x0=x0-1;
}
xl=x0+1; //最左象素.
//检查上一条扫描线,若存在非边界且未填充的象素,则选取代
//表各连续区间的种子象素入栈
x0=xl; yy=y;
y++; xx=x0;
while(x0<=xr)
{ //注意此处tag
tag=0;
while((pcolor=cdc->GetPixel(x0,y))==bgcolor && x0<xr)
{ //(pixel(x0,y)的值不等于边界值)&&(pixle(x0,y)的值不等于多边形色)&&(x0<xr)
if(tag==0) tag=1;
x0++;
}
if(tag==1)
{
if(x0==xr && (pcolor=cdc->GetPixel(x0,y))==bgcolor)
//(x0==xr)&& (pixel(x0,y)的值不等于边界值)&& (pixle(x0,y)的值不等于多边形色)
{ //push(pixel(x0,y);
ptemp.x=x0; ptemp.y=y;
push(ptemp);
}
else
{ ptemp.x=x0-1; ptemp.y=y;
push(ptemp);
}
tag=0;
}
int xnextspan=x0; while(((pcolor=cdc->GetPixel(x0,y))==pickcolor ||pcolor==drawcolor) && x0<xr)
// (pixel(x0,y)等于边界值) || (pixel(x0,y)等于多边形色) &&(x0<xr)
x0++;
if(xnextspan==x0) x0++;
}//while(x0=xr)
//检查下一条扫描线,若存在非边界,未填充的象素,则选取代表各连续区间的种子象素入栈;
//算法与前面处理上一条扫描线的算法完全一样,只要把y+1,换为y-1即可.
y=yy; y--; x0=xx;
while(x0<=xr)
{ //注意此处tag
tag=0;
while((pcolor=cdc->GetPixel(x0,y))==bgcolor && x0<xr)
{ //(pixel(x0,y)的值不等于边界值)&&(pixle(x0,y)的值不等于多边形色)&&(x0<xr)
if(tag==0) tag=1;
x0++;
}
if(tag==1)
{
if(x0==xr && (pcolor=cdc->GetPixel(x0,y))==bgcolor)
//(x0==xr)&& (pixel(x0,y)的值不等于边界值)&& (pixle(x0,y)的值不等于多边形色)
{ //push(pixel(x0,y);
ptemp.x=x0; ptemp.y=y;
push(ptemp);
}
else
{ ptemp.x=x0-1; ptemp.y=y;
//push(pixel(x0-1,y));
push(ptemp);
}
tag=0;
}
int xnextspan=x0; while((pcolor=cdc->GetPixel(x0,y))==pickcolor ||pcolor==drawcolor && x0<xr)
// (pixel(x0,y)等于边界值) || (pixel(x0,y)等于多边形色) &&(x0<xr)
x0++;
if(xnextspan==x0) x0++;
}//while(x0=xr)
}//while象素栈非空}