|
|
扫描线种子填充算法
将区域内由边界点限定的同一行内相连接的不具有新值newvalue的一组象素称为一个象素段,象素段用它最右边的象素来标识。
算法的步骤如下: 1.对种子所在象素段进行填充。
2.从右至左检查种子所在行的上一横行,将查得的象素段依次编号存入堆栈。接着对种子所在行的下一横行同样处理。
3.若堆栈为空则算法结束,否则从堆栈顶部取出一个象素段。就以这个象素为新的种子,返回到1。
下面我们用伪C语言写出扫描线填充算法。
void ScanlineSeedfill(int x,int y,COLORREF boundaryvalue,COLORREF
newvalue)
{ int x0,xl,xr,y0,xid; int flag;
Stack s; Point
p; s.push(Point(x,y));//种子象素入栈
while(!s.isempty()) {
p=s.pop(); //栈顶象素出栈
x=p.x; y=p.y;
SetPixel(x ,y
,newvalue); x0=
x+1; while(GetPixel(x0,y)!=boundaryvalue)//填充右方象素
{ SetPixel(x0
,y ,newvalue); x0++;
} xr=x0-1;//最右象素
x0= x-1;
while(GetPixel(x0,y)!=boundaryvalue)//填充左方象素
{ SetPixel(x0
,y ,newvalue); x0--;
} |
|
|
|