利用区域的连通性进行区域填充, 除了需要区域应该明确定义外,还需要 事先给定一个区域内部象素,这个象素 称为种子。 做区域填充时,要进行对光栅网格 的遍历,找出由种子出发能达到而又不 穿过边界的所有象素。 这种利用连通性的填充,其主要优 点是不受区域不规则性的影响,主要缺 点是需要事先知道一个内部象素
利用区域的连通性进行区域填充, 除了需要区域应该明确定义外,还需要 事先给定一个区域内部象素,这个象素 称为种子。 做区域填充时,要进行对光栅网格 的遍历,找出由种子出发能达到而又不 穿过边界的所有象素。 这种利用连通性的填充,其主要优 点是不受区域不规则性的影响,主要缺 点是需要事先知道一个内部象素
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-l,oldvalue,.newvalue);l/四向扩散 Floodfill(x,y+1,oldvalue,newvalue); Floodfill(x-1,y,oldvalue,newvalue); Floodfill(x+1,y,oldvalue,newvalue);
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是区域内象素新值,未填充前区域 内不应有值为aewvaluel的象素。*/ if(GetPixel(x,y)!=boundaryvalue &GetPixel(x,y)!=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);
{ 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); } }
扫描线种子填充算法 将区域内由边界点限定的同一行内相 连接的不具有新值newvalue的一组象素 称为一个象素段,象素段用它最右边的 象素来标识。 算法的步骤如下: 1.对种子所在象素段进行填充。 2.从右至左检查种子所在行的上一 横行,将查得的象素段依次编号存入堆 栈。接着对种子所在行的下一横行同样 处理
扫描线种子填充算法 将区域内由边界点限定的同一行内相 连接的不具有新值newvalue的一组象素 称为一个象素段,象素段用它最右边的 象素来标识。 算法的步骤如下: 1.对种子所在象素段进行填充。 2.从右至左检查种子所在行的上一 横行,将查得的象素段依次编号存入堆 栈。接着对种子所在行的下一横行同样 处理