




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验二 有效边表填充算法实验题目: 有效边表填充算法 学号: 姓名: 班级: 指导老师: 完成日期: 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)。在 1024768 的显示分辩率下,将多边形顶点放大为 P0(500,400) ,P1(350,600) ,P2(250,350),P3(350,50), P4(500,250), P5(600,50), P6(800,450)。 图1示例多边形图2屏幕显示多边形3.算法设计:多边形的有效边表填充算法的基本原理是按照扫描线从小到大的移动顺序,计算当前扫描线与多边形各边的交点,然后把这些交点按x值递增的顺序进行排序、配对,以确定填充区间,然后用指定颜色点亮填充区间的所有像素,即完成填充工作。有效边表填充算法通过访问多边形覆盖区间内的每个像素,可以填充凸、凹多边形和环,已成为目前最为有效的多边形填充算法。4.源程序:1)/AET.h和AET.cppclass AET public:AET();virtual AET();double x;int yMax;double k; /代替1/kAET *next;2)/Bucket.h和Bucket.cppclass Bucket public:Bucket();virtual Bucket();int ScanLine;AET *p;/桶上的边表指针Bucket *next;3) / TestView.h#include AET.h/包含有效边表类#include Bucket.h/包含桶类#define Number 7/N为闭合多边形顶点数,顶点存放在整型二维数组PointN中class CTestView : public CView。public:void PolygonFill();/上闭下开填充多边形void CreatBucket();/建立桶结点桶void Et();/构造边表void AddEdge(AET *);/将边插入AET表void EdgeOrder();/对AET表进行排序 。protected:COLORREF GetColor;/调色板CPoint Point7;/定义多边形Bucket *HeadB,*CurrentB;/桶的头结点和当前结点AET ENumber,*HeadE,*CurrentE,*T1,*T2;/有效边表的结点4)/ TestView.cppCTestView:CTestView()/设置多边形的7个顶点Point0=CPoint(550,400);/P0Point1=CPoint(350,600);/P1Point2=CPoint(250,350);/P2Point3=CPoint(350,50);/P3Point4=CPoint(500,250);/P4Point5=CPoint(600,50);/P5Point6=CPoint(800,450);/P6void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);pDC-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); void CTestView:OnMenuAET() /菜单函数AfxGetMainWnd()-SetWindowText(多边形有效边表填充算法);/显示标题CColorDialog ccd(GetColor);if(ccd.DoModal()=IDOK)/调用调色板选取前景色GetColor=ccd.GetColor();RedrawWindow();/刷新屏幕CreatBucket();/初始化桶Et();/建立边表PolygonFill();/多边形填充void CTestView:CreatBucket()/初始化桶int ScanMin,ScanMax;/确定扫描线的最小值和最大值ScanMax=ScanMin=Point0.y;for(int i=1;iNumber;i+)if(Pointi.yScanMax)ScanMax=Pointi.y;/扫描线的最大值for(i=ScanMin;iScanLine=ScanMin;CurrentB-p=NULL;/没有连接边链表CurrentB-next=NULL;else/建立桶的其它结点CurrentB-next=new Bucket;/新建一个桶结点CurrentB=CurrentB-next;/使CurrentB指向新建的桶结点CurrentB-ScanLine=i;CurrentB-p=NULL;/没有连接边链表CurrentB-next=NULL;void CTestView:Et()/构造边表 for(int i=0;iPointi.y)/终点比起点高while(CurrentB-ScanLine!=Pointi.y)/在桶内寻找该边的yMinCurrentB=CurrentB-next;/移到下一个桶结点Ei.x=Pointi.x;/计算AET表的值Ei.yMax=Pointj.y;Ei.k=double(Pointj.x-Pointi.x)/(Pointj.y-Pointi.y);/代表1/kEi.next=NULL;CurrentE=CurrentB-p;/获得桶上链接边表的地址if(CurrentB-p=NULL)/当前桶结点上没有链接边结点CurrentE=&Ei;/赋边的起始地址CurrentB-p=CurrentE;/第一个边结点直接连接到对应的桶中elsewhile(CurrentE-next!=NULL)/如果当前边已连有边结点CurrentE=CurrentE-next;/移动指针到当前边的最后一个边结点CurrentE-next=&Ei;/把当前边接上去if(Pointj.yScanLine!=Pointj.y)CurrentB=CurrentB-next;Ei.x=Pointj.x;Ei.yMax=Pointi.y;Ei.k=double(Pointi.x-Pointj.x)/(Pointi.y-Pointj.y);Ei.next=NULL;CurrentE=CurrentB-p;if(CurrentE=NULL)CurrentE=&Ei;CurrentB-p=CurrentE;elsewhile(CurrentE-next!=NULL)CurrentE=CurrentE-next;CurrentE-next=&Ei;CurrentB=NULL;CurrentE=NULL;void CTestView:AddEdge(AET *NewEdge)/插入临时边表函数 T1=HeadE;if(T1=NULL)/边表为空,将边表置为TempEdgeT1=NewEdge;HeadE=T1;elsewhile(T1-next!=NULL)/边表不为空,将TempEdge连在该边之后T1=T1-next;T1-next=NewEdge;void CTestView:EdgeOrder()/对边表进行排序函数 T1=HeadE;if(T1=NULL)return;if(T1-next=NULL)/如果该边表没有再连边表return;/桶结点只有一条边,不需要排序elseif(T1-next-xx)/边表按x值排序T2=T1-next;T1-next=T2-next;T2-next=T1;HeadE=T2;T2=HeadE;T1=HeadE-next;while(T1-next!=NULL)/继续两两比较相连的边表的x值,进行排序if(T1-next-xx)T2-next=T1-next;T1-next=T1-next-next;T2-next-next=T1;T2=T2-next;elseT2=T1;T1=T1-next;void CTestView:PolygonFill()/多边形填充函数HeadE=NULL;for(CurrentB=HeadB;CurrentB!=NULL;CurrentB=CurrentB-next)/访问所有桶结点for(CurrentE=CurrentB-p;CurrentE!=NULL;CurrentE=CurrentE-next)/访问桶中排序前的边结点AET *TempEdge=new AET;TempEdge-x=CurrentE-x;TempEdge-yMax=CurrentE-yMax;TempEdge-k=CurrentE-k;TempEdge-next=NULL;AddEdge(TempEdge);/将该边插入临时Aet表EdgeOrder();/使得边表按照x递增的顺序存放T1=HeadE;/根据ymax抛弃扫描完的边结点if(T1=NULL)return;while(CurrentB-ScanLine=T1-yMax)/放弃该结点,Aet表指针后移(下闭上开)T1=T1-next;HeadE=T1;if(HeadE=NULL)return;if(T1-next!=NULL)T2=T1;T1=T2-next;while(T1!=NULL)if(CurrentB-ScanLine=T1-yMax)/跳过一个结点T2-next=T1-next;T1-next=NULL;T1=T2-next;elseT2=T1;T1=T2-next;BOOL In=false;/设置一个BOOL变量In,初始值为假double xb,xe;/扫描线的起点和终点for(T1=HeadE;T1!=NULL;T1=T1-next)/填充扫描线和多边形相交的区间if(In=false)xb=T1-x;In=true;/每访问一个结点,把In值取反一次else/如果In值为真,则填充从当前结点的x值开始到下一结点的x值结束的区间xe=T1-x-1;/左
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新课程方案及课标解读
- 群众性创新汇报
- 诗经《氓》上课用
- 护理主任年度总结报告
- 中医外科学多媒体课件肛门直肠疾病肛瘘
- 亲一亲课件教学课件
- 脑血管病的护理管理
- 腰椎骨滑脱症护理查房
- 快递财务工作总结
- 药品经营质量管理规范解读
- 临床护理模拟情景案例教学
- 鞋类制作工艺流程
- 电信研发工程师L1认证培训考试复习题库(含答案)
- 《中华人民共和国学前教育法》专题培训
- 公路水泥混凝土路面施工方案
- 数字经济学 课件全套 第1-15章 数字经济学基础 - 数字经济监管
- 辽宁省抚顺市新抚区2024-2025学年九年级上学期第一次月考数学试题(含答案)
- 校园消毒知识学习培训
- 中医适宜技术-中药热奄包
- 关于成立低空经济公司可行性分析报告
- 2024年第九届“学宪法、讲宪法”竞赛题库试卷及答案
评论
0/150
提交评论