文档详情

实验2:多边形区域扫描线填充或种子填充.doc

发布:2017-01-05约2.86千字共7页下载文档
文本预览下载声明
实验2:多边形区域扫描线填充或种子填充 一、、void CZhztchView::boundaryfill4(int x, int y, int boundarycolor, int newcolor) { int color; CClientDC dc(this); //获取客户区设备描述表 color=dc.GetPixel(x,y); if(color!=newcolorcolor!=boundarycolor) { dc.SetPixel(x,y,newcolor); boundaryfill4(x,y+1,boundarycolor,newcolor); boundaryfill4(x,y-1,boundarycolor,newcolor); boundaryfill4(x-1,y,boundarycolor,newcolor); boundaryfill4(x+1,y,boundarycolor,newcolor); } } //////////////////////////////////////////////////////////////////////////////// //扫描线填充算法 void CZhztchView::OnScanfill() { RedrawWindow(); CDC* pDC=GetDC(); CPen newpen(PS_SOLID,3,RGB(255,0,0)); CPen *old=pDC-SelectObject(newpen); spt[0]=CPoint(100,100); //绘制多边形区域 spt[1]=CPoint(300,100); spt[2]=CPoint(250,250); spt[3]=CPoint(100,250); spt[4]=CPoint(150,200); spt[5]=CPoint(90,180); spt[6]=CPoint(150,150); spt[7]=CPoint(100,100); pDC-Polyline(spt,8); //pDC-SelectObject(old); //ReleaseDC(pDC); // TODO: Add your command handler code here //CDC* pDC=GetDC(); CPen newpen2(PS_SOLID,1,RGB(0,255,0)); CPen *old2=pDC-SelectObject(newpen2); int j,k,s = 0; int p[5]; //每根扫描线交点 int pmin = 0,pmax = 0; for(int i=0;i=6;i++)//建立边表 { edge[i].dx=(float)(spt[i+1].x-spt[i].x)/(spt[i+1].y-spt[i].y); if(spt[i].y=spt[i+1].y){ edge[i].num=i; edge[i].ymin=spt[i].y; edge[i].ymax=spt[i+1].y; edge[i].xmin=(float)spt[i].x; edge[i].xmax=(float)spt[i+1].x; if(spt[i+1].y pmax) pmax = spt[i+1].y; if(spt[i].y pmin) pmin = spt[i].y; } else{ edge[i].num=i; edge[i].ymin=spt[i+1].y; edge[i].ymax=spt[i].y; edge[i].xmax=(float)spt[i].x; edge[i].xmin=(float)spt[i+1].x; if(spt[i].y pmax) pmax = spt[i].y; if(spt[i+1].y pmin) pmin = spt[i+1].y; } } for(int r=1;r=6;r++) //排序edge(yUpper,xIntersect),结果为从大到小 { for(int q=0;q=6-r;q++) { if(edge[q].yminedge[q+1].ymin) { newedge[0]=edge[q]; edge[q]=edge[q+1]; edge[q+1]=newedge[0]; } }
显示全部
相似文档