区域填充之扫描线算法(续)

       自上一篇《区域填充之扫描线算法》只是简单的实现了区域填充,但后来我在上实验课时再次运行却有点问题,询问老师,老师说是内存溢出。所以我就继续优化了下,主要在于AET的更新。以及创建的ET表

代码具体如下:

//---------------------------------------------------------------------------------------
//扫描线填充算法的改进(对于AET的更新)
void regionfill2(HDC hdc,Point1 *p,int len,int ymin,int ymax)
{
	EdgeTable ET(ymax-ymin+1);
	//创建ET表
	ET.createTableEdge(p,len,ymin,ymax);
	LList<Edge>* AET=new LList<Edge>();
	LList<Edge>* tempAET;
	Edge curr,temp;
	for(int i=0;i<=(ymax-ymin+1);i++)
	{
		if(!ET.isEmptyInLine(i))
		{
			tempAET=ET.getValue(i);
			for(tempAET->setStart();tempAET->getValue(curr);tempAET->next())
				AET->sortInsert(curr);

			tempAET->clear();	
		}

		//两两配对填充
		for(AET->setStart();AET->getValue(curr);AET->next())
		{
			AET->next();
			AET->getValue(temp);
			for(int x0=int(curr.x);x0<=temp.x;x0++)
				SetPixel(hdc,x0,i+ymin,255);
	//如果AET表中某记录的ymax=扫描线y,则删除该记录
			if(curr.ymax==i)
				AET->Delete(curr);
			if(temp.ymax==i)
				AET->Delete(curr);
		}
	//在AET表中的每个记录 对x进行修改
			
		for(AET->setStart();AET->getValue(curr);AET->next())
		{
			curr.x+=curr.increment;
			//tempAET=new LList<Edge>();
			tempAET->sortInsert(curr);

		}
			
		//为何到此处运行结束?????
		AET->clear();
		for(tempAET->setStart();tempAET->getValue(curr);tempAET->next())
		{
			AET->append(curr);
		}
			
	}
}

        这里对于顶点的保存其实用向量更为恰当。其他地方的略微更改,这里不列出了。但通过调试,却出现了一个匪夷所思的问题:即上面代码有处注释所示运行到该处就提示:test2.exe 中的 0x0125611f 处最可能的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突。

        上网查了下,有人说是浏览器360的问题,有的说是qq的问题。还有的说是VS2010的BUG。搞得我也不知道哪出错了,我认为内存应该没泄露的,因为这次比上一篇的内存开销明显减少。所以我也倾向认为是VS2010的BUG。但不确定,所以若有知道的指点下。以及该如何进行修改?
       介于程序未能运行成功,所以没上传代码。若有兴趣的可以联系本人获取完整代码以及一起讨论下此问题。

你可能感兴趣的:(优化,算法,浏览器,qq,360,2010)