实验一种子填充算法实验目的:掌握种子填充算法的思想,掌握队列的使用,掌握基于队列的四连通区域填充算法。实验内容:对于任意给定的多边形,在屏幕上显示该多边形,根据给定的多边形区域内种子,对多边形区域进行填充。多边形区域为四连通区域,要求采用链队存储种子点。实验原理:种子填充算法采用的边界定义是区域边界上所有像素均具有某个特定的颜色值,区域内部所有像素均不取这一特定颜色,而边界外的像素则可以具有和边界相同的颜色值。程序从(x,y)开始,先检测该点的颜色,如果它与边界色和填充色均不相同,就用填充色填充该点,然后检测相邻位置,以确定它们是否边界色和填充色,若不是,就填充该相邻点。这个过程延续到已经检测完边界范围内的所有像素为止。实验步骤:(1)队列结构定义种子堆栈的结构和队列结构,并定义相应变量。(2)确定多边形顶点坐标在Initial函数中对顶点序列进行赋值。(3)生成多边形即将由顶点序列所定义的多边形显示出来,也就实现了多边形的边界定义。(4)填充多边形区域1)确定初始种子点可以交互给出,例中直接给出。用指定的非填充颜色填充该像素,以标出初始种子点,同时将该点送入种子队列。2)如果,种子队列非空,从队尾取出种子。3)判断种子是否为边界色或填充色,如果不是填充该点,将该种子送入队列。4)判断该点的四个相邻像素是否为边界色或填充色,如果不是,填充该像素,同时将该点送入种子队列。5)重复步骤2),3),4)实验效果:程序实现:SeedFillView.h//SeedFillView.h:interfaceoftheCSeedFillViewclass///////////////////////////////////////////////////////////////////////////////#if!defined(AFX_SEEDFILLVIEW_H__A4808C3F_AA5A_438B_93CD_5295DF06ABBD__INCLUDED_)#defineAFX_SEEDFILLVIEW_H__A4808C3F_AA5A_438B_93CD_5295DF06ABBD__INCLUDED_#if_MSC_VER1000#pragmaonce#endif//_MSC_VER1000typedefstructQNode{POINTData;structQNode*next;};//链表结构typedefstructLinkQueue{QNode*front;QNode*rear;};//队列结构classCSeedFillView:publicCView{protected://createfromserializationonlyCSeedFillView();DECLARE_DYNCREATE(CSeedFillView)//Attributespublic:CSeedFillDoc*GetDocument();//Operationspublic://Overrides//ClassWizardgeneratedvirtualfunctionoverrides//{{AFX_VIRTUAL(CSeedFillView)public:virtualvoidOnDraw(CDC*pDC);//overriddentodrawthisviewvirtualBOOLPreCreateWindow(CREATESTRUCT&cs);protected:virtualBOOLOnPreparePrinting(CPrintInfo*pInfo);virtualvoidOnBeginPrinting(CDC*pDC,CPrintInfo*pInfo);virtualvoidOnEndPrinting(CDC*pDC,CPrintInfo*pInfo);//}}AFX_VIRTUAL//Implementationpublic:voidInitial(POINT*pts,intptn);//对多边形顶点序列进行赋值voidEdgeMark(POINTv1,POINTv2,COLORREFbcolor);//绘制该多边形voidQSeedFill(intptn,POINT*pts,POINTseed,COLORREFfcolor,COLORREFbcolor);//多边形填充主函数voidQueueSeedFill(POINTseed,COLORREFfcolor,COLORREFbcolor);//某一种子的//填充函数intEmpty();//判断种子队列非空voidEnqueue(POINTpt);//种子入队POINTDequeue();//种子出队LinkQueueq;//队列变量virtual~CSeedFillView();#ifdef_DEBUGvirtualvoidAssertValid()const;virtualvoidDump(CDumpContext&dc)const;#endifprotected://Generatedmessagemapfunctionsprotected://{{AFX_MSG(CSeedFillView)//NOTE-theClassWizardwilladdandremovememberfunctionshere.//DONOTEDITwhatyouseeintheseblocksofgeneratedcode!//}}AFX_MSGDECLARE_MESSAGE_MAP()};#ifndef_DEBUG//debugversioninSeedFillView.cppinlineCSeedFillDoc*CSeedFillView::GetDocument(){return(CSeedFillDoc*)m_pDocument;}#endif///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}//MicrosoftVisualC++willinsertadditionaldeclarationsimmediatelybeforethepreviousline.#endif//!defined(AFX_SEEDFILLVIEW_H__A4808C3F_AA5A_438B_93CD_5295DF06ABBD__INCLUDED_)“SeedFillView.cpp”//SeedFillView.cpp:implementationoftheCSeedFillViewclass//#includestdafx.h#includeSeedFill.h#includeSeedFillDoc.h#includeSeedFillView.h#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CSeedFillViewIMPLEMENT_DYNCREATE(CSeedFillView,CView)BEGIN_MESSAGE_MAP(CSeedFillView,CView)//{{AFX_MSG_MAP(CSeedFillView)//NOTE-theClassWizardwilladdandremovemappingmacroshere.//DONOTEDITwhatyouseeintheseblocksofgeneratedcode!//}}AFX_MSG_MAP//StandardprintingcommandsON_COMMAND(ID_FILE_PRINT,CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT,CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView::OnFilePrintPreview)END_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CSeedFillViewconstruction/destructionCSeedFillView::CSeedFillView(){//TODO:addconstructioncodehere}CSeedFillView::~CSeedFillView(){}BOOLCSeedFillView::PreCreateWindow(CREATESTRUCT&cs){//TODO:ModifytheWindowclassorstylesherebymodifying//theCREATESTRUCTcsreturnCView::PreCreateWindow(cs);}///////////////////////////////////////////////////////////////////////////////CSeedFillViewdrawingvoidCSeedFillView::OnDraw(CDC*pDC){CSeedFillDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);//TODO:adddrawcodefornativedataherePOINT*pts,seed;//多边形顶点序列和种子intptn=6;//多边形顶点个数pts=newPOINT[ptn];seed.x=30;seed.y=50;//种子初始化Initial(pts,ptn);//多边形顶点赋值QSeedFill(ptn,pts,seed,RGB(255,0,0),RGB(0,0,255));//多边形区域填充pDC-SetPixel(seed,RGB(0,255,0));//用非边界色和填充色填充初始种子点}///////////////////////////////////////////////////////////////////////////////CSeedFillViewprintingBOOLCSeedFillView::OnPreparePrinting(CPrintInfo*pInfo){//defaultpreparationreturnDoPreparePrinting(pInfo);}voidCSeedFillView::OnBeginPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/){//TODO:addextrainitializationbeforeprinting}voidCSeedFillView::OnEndPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/){//TODO:addcleanupafterprinting}///////////////////////////////////////////////////////////////////////////////CSeedFillViewdiagnostics#ifdef_DEBUGvoidCSeedFillView::AssertValid()const{CView::AssertValid();}voidCSeedFillView::Dump(CDumpContext&dc)const{CView::Dump(dc);}CSeedFillDoc*CSeedFillView::GetDocument()//non-debugversionisinlin