资源描述:
《有效边表填充算法.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、实验二有效边表填充算法实验题目:有效边表填充算法学号:姓名:班级:指导老师:完成日期:1.实验目的:设计有效边表结点和边表结点数据结构设计有效边表填充算法编程实现有效边表填充算法2.实验描述:下图1所示多边形覆盖了12条扫描线,共有7个顶点和7条边。7个顶点分别为:P0(7,8),P1(3,12),P2(1,7),P3(3,1),P4(6,5),P5(8,1),P6(12,9)。在1024×768的显示分辩率下,将多边形顶点放大为P0(500,400),P1(350,600),P2(250,350),P3(350,50),P4(500,250),P5(600,50)
2、,P6(800,450)。11图1示例多边形11图2屏幕显示多边形3.算法设计:多边形的有效边表填充算法的基本原理是按照扫描线从小到大的移动顺序,计算当前扫描线与多边形各边的交点,然后把这些交点按x值递增的顺序进行排序、配对,以确定填充区间,然后用指定颜色点亮填充区间的所有像素,即完成填充工作。有效边表填充算法通过访问多边形覆盖区间内的每个像素,可以填充凸、凹多边形和环,已成为目前最为有效的多边形填充算法。4.源程序:1)//AET.h和AET..cppclassAET{public:AET();virtual~AET();doublex;intyMax;doubl
3、ek;//代替1/kAET*next;}2)//Bucket.h和Bucket.cppclassBucket{public:11Bucket();virtual~Bucket();intScanLine;AET*p;//桶上的边表指针Bucket*next;}3)//TestView.h#include"AET.h"//包含有效边表类#include"Bucket.h"//包含桶类#defineNumber7//N为闭合多边形顶点数,顶点存放在整型二维数组Point[N]中classCTestView:publicCView{。。。。。。。。。public:void
4、PolygonFill();//上闭下开填充多边形voidCreatBucket();//建立桶结点桶voidEt();//构造边表voidAddEdge(AET*);//将边插入AET表voidEdgeOrder();//对AET表进行排序。。。。。。。。。。protected:COLORREFGetColor;//调色板CPointPoint[7];//定义多边形Bucket*HeadB,*CurrentB;//桶的头结点和当前结点AETE[Number],*HeadE,*CurrentE,*T1,*T2;//有效边表的结点4)//TestView.cppCTe
5、stView::CTestView(){//设置多边形的7个顶点Point[0]=CPoint(550,400);//P0Point[1]=CPoint(350,600);//P1Point[2]=CPoint(250,350);//P2Point[3]=CPoint(350,50);//P3Point[4]=CPoint(500,250);//P4Point[5]=CPoint(600,50);//P5Point[6]=CPoint(800,450);//P6}voidCTestView::OnDraw(CDC*pDC){CTestDoc*pDoc=GetDocu
6、ment();ASSERT_VALID(pDoc);11pDC->Polygon(Point,7);//绘制多边形//输出多边形的顶点编号pDC->TextOut(550,410,"P0");pDC->TextOut(350,600,"P1");pDC->TextOut(230,340,"P2");pDC->TextOut(350,30,"P3");pDC->TextOut(490,220,"P4");pDC->TextOut(600,30,"P5");pDC->TextOut(805,450,"P6");}voidCTestView::OnMenuAET()//菜
7、单函数{AfxGetMainWnd()->SetWindowText("多边形有效边表填充算法");//显示标题CColorDialogccd(GetColor);if(ccd.DoModal()==IDOK)//调用调色板选取前景色{GetColor=ccd.GetColor();}RedrawWindow();//刷新屏幕CreatBucket();//初始化桶Et();//建立边表PolygonFill();//多边形填充}voidCTestView::CreatBucket()//初始化桶{intScanMin,ScanMax;//确定扫描线的最小值和最