1、实验二4-10一、实验题目扫描线种子填充算法是通过扫描线来填充多边形内的水平像素段,处理每条扫描线时仅需将其最右端像素入栈,可以有效提高填充效率。请使用MFC编程填充图4-60所示的空心体汉字(四连通),填充效果如图4-61所示。二、实验思想扫描线种子填充算法:先将种子像素入栈,种子像素为栈底像素,如果栈不为空,执行如下4步操作。(1)栈顶像素出栈。(2)沿扫描线对出栈像素的左右像素进行填充,直至遇到边界像素为止。即每出栈一个像素,就对区域内包含该像素的整个连续区间进行填充。(3)同时记录该区间,将区间最左端像素记为xleft,最右端像素记为xright。(4)在区间xleft,xright
2、中检查与当前扫描线相邻的上下两条扫描线的有关像素是否全为边界像素或已填充像素,若存在非边界且未填充的像素,则把未填充区间的最右端像素取作种子像素入栈。三、实验代码voidCTestView:OnLButtonDown(UINTnFlags,CPointpoint)/左键按下函数/TODO:Addyourmessagehandlercodehereand/orcalldefaultSeed=point;/选择种子位置CharFill();/进行填充CView:OnLButtonDown(nFlags,point);voidCTestView:CharFill()
3、/文字填充函数CRectRect;GetClientRect(&Rect);CClientDCdc(this);COLORREFBoundColor;/边界色intWidth=Rect.right-Rect.left;intHight=Rect.bottom-Rect.top;intFlag;intx0,y0,x,y;CPointPoint;std:vector
4、Seed);/把种子结点压入数组序列BoundColor=RGB(0,0,0);/定义边界色为黑色while(!FillBuffle.empty()/如果数组序列非空Point=FillBuffle.front();/弹出数组序列头元素x=Point.x;y=Point.y;FillBuffle.erase(FillBuffle.begin();/清除数组序列内的元素dc.SetPixel(Point,Fillcolor);/绘制像素/判断像素的位置是否在图形内部x0=x+1;/右方判断while(dc.GetPixel(x0,y)!=BoundColor&&dc.GetP
5、ixel(x0,y)!=Fillcolor)x0=x0+1;if(x0>=Width)/到达屏幕最右端MessageBox("种子超出范围","警告");RedrawWindow();return;y0=y+1;/下方判断while(dc.GetPixel(x,y0)!=BoundColor&&dc.GetPixel(x,y0)!=Fillcolor)y0=y0+1;if(y0>=Hight)/到达屏幕最下端MessageBox("种子超出范围","警告");RedrawWindow
6、();return;RightPoint.x=x0;/右边界内的左邻点x0=x-1;while(dc.GetPixel(x0,y)!=Fillcolor&&dc.GetPixel(x0,y)!=BoundColor)dc.SetPixel(x0,y,Fillcolor);x0=x0-1;if(x0<=0)/到达屏幕最左端MessageBox("种子超出范围","警告");RedrawWindow();return;y0=y-1;while(dc.GetPixel(x,y0)!=BoundColor&&dc.GetP
7、ixel(x,y0)!=Fillcolor)y0=y0-1;if(y0<=0)/到达屏幕最上端MessageBox("种子超出范围","警告");RedrawWindow();return;LeftPoint.x=x0+1;/左边界内的右邻点x0=LeftPoint.x;y=y+1;/下一条扫描线while(x0 8、;if(Flag=1)if(x0=RightPoint.x)&&(dc.GetPixel(x0,y)!=Fillcolor)&&(dc.GetPixel(x0,y)!=BoundColor)FillBuffle.push_back(CPoint(x0,y);/进入数组序列elseFillBuffle.push_back(CPoint(x0-1,y);Flag=0;PointNext.x=x0;while(dc.GetPixel(x0,y)=Fillcolor)&&(x0 9、oundColor)&&(x0