|
|
利用区域的连通性进行区域填充,除了需要区域应该明确定义外,还需要事先给定一个区域内部象素,这个象素称为种子。
做区域填充时,要进行对光栅网格的遍历,找出由种子出发能达到而又不穿过边界的所有象素。
这种利用连通性的填充,其主要优点是不受区域不规则性的影响,主要缺点是需要事先知道一个内部象素。
void Floodfill(int x,int y,COLORREF oldvalue,COLORREF newvalue)
/*(x,y)为种子 oldvalue是原值 newvalue是新值,应不等于原值。*/
{ if (GetPixel(x,y) == oldvalue)
{ SetPixel(x,y,newvalue);//赋值为新值 Floodfill(x,y-1,oldvalue,newvalue);//四向扩散
Floodfill(x,y+1,oldvalue,newvalue);
Floodfill(x-1,y,oldvalue,newvalue);
Floodfill(x+1,y,oldvalue,newvalue);
}
}
void Boundaryfill(int x,int y,COLORREF boundaryvalue,COLORREF
newvalue)
/*(x,y) 为种子位置boundaryvalue是边界象素值newvalue是区域内象素新值,未填充前区域内不应有值为newvalue的象素。*/
{ if( GetPixel(x,y)!=boundaryvalue && GetPixel(x,y)!=newvalue)
// 未达边界且未访问过
{ SetPixel(x,y,newvalue);//赋以新值
Boundaryfill(x,y-1,boundaryvalue,newvalue);
//向四个方向扩散 Boundaryfill(x,y+1,boundaryvalue,newvalue);
Boundaryfill(x-1,y,boundaryvalue,newvalue);
Boundaryfill(x+1,y,boundaryvalue,newvalue);
}
} |
|
|
|