用mfc实现扫描线种子填充算法,但老是报栈出错误,求懂的人解决一下
void CTestdView::ScanlineSeedfill(int x, int y, COLORREF boundaryvalue, COLORREF newvalue){
using namespace std;
int x0,x1,xr,y0,xid;
bool flag;
int count=0;
stack<point> s;
//point p;
s.push(point(x,y));//种子像素入栈
while(!s.empty())//判断栈是否为空
{
p=s.top;//读取栈顶元素
s.pop ();//栈顶像素出栈
x=p.x;
y=p.y;
SetPixel(x,y,newvalue);
x0=x+1;
while(GetPixel(x0,y)!=boundaryvalue && GetPixel(x0,y)!=newvalue)//填充种子右方像素
{
SetPixel(x0,y,newvalue);
x0++;
}
xr=x0-1;//最右边像素位置
x0=x-1;
while(GetPixel(x0,y)!=boundvalue && GetPixel(x0,y)!=newvalue)//填充种子左方像素
{
SetPixel(x0,y,newvalue);
x0--;
}
xl=x0+1;//最左边像素的位置
/*检查上一条扫描线与下一条扫描线,若存在非边界且未填充的像素,
则选取代表个连续区间的种子像素入栈*/
y0=y;
for(int i=1;i>=-1;i-=2)
{
x0=xr;
y=y0+i;
while(x0>=xl)
{
flag=false;
while((GetPixel(x0,y)!=boundvalue && GetPixel(x0,y)!=newvalue)
&& (x0>=xl))//寻找当前像素段的种子像素
{
if(!flag)
{
flag=true;
xid=x0;
}
xo--;
}
/*将当前像素段的种子像素压入栈中*/
if(flag)
{
s.push(Point(xid,y));
flag=false;
}
/*检查当前填充是否被中断,
若被中断,即当前点为边界点或已填充点,
寻找左方第一个可填充像素,当前点向左移动*/
while(((GetPixel(x0,y)!=boundvalue)||
(GetPixel(x0,y)!=newvalue))
&& (x0>=xl))
x0--;
}
}
}
}
运行时显示错误如下:
:\所有写的代码文件包\计算机图形学\test d\test dView.cpp(108) : error C2871: 'std' : does not exist or is not a namespace
E:\所有写的代码文件包\计算机图形学\test d\test dView.cpp(113) : error C2065: 'stack' : undeclared identifier
E:\所有写的代码文件包\计算机图形学\test d\test dView.cpp(113) : error C2065: 'point' : undeclared identifier
E:\所有写的代码文件包\计算机图形学\test d\test dView.cpp(113) : error C2065: 's' : undeclared identifier
E:\所有写的代码文件包\计算机图形学\test d\test dView.cpp(113) : warning C4804: '>' : unsafe use of type 'bool' in operation
E:\所有写的代码文件包\计算机图形学\test d\test dView.cpp(113) : warning C4552: '>' : operator has no effect; expected operator with side-effect
E:\所有写的代码文件包\计算机图形学\test d\test dView.cpp(115) : error C2228: left of '.push' must have class/struct/union type
E:\所有写的代码文件包\计算机图形学\test d\test dView.cpp(117) : error C2228: left of '.empty' must have class/struct/union type
E:\所有写的代码文件包\计算机图形学\test d\test dView.cpp(117) : fatal error C1903: unable to recover from previous error(s); stopping compilation
执行 cl.exe 时出错.