ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:106.09KB ,
资源ID:3143463      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3143463.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(VC++多边形的填充.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

VC++多边形的填充.docx

1、VC+多边形的填充实验二 有效边表填充算法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)。请

2、使用有效边表算法填充该多边形。 图1示例多边形图2 屏幕显示多边形3.算法设计:1根据多边形顶点坐标值,计算扫描线的最大值ScanMax和最小值ScanMin。2用多边形覆盖的扫描线动态建立桶结点。3循环多边形的所有顶点,根据边的终点y 值比起点y值高或边的终点y值比起点y值低两种情况(边的终点y值和起点y值相等的情况属于扫描线,不予考虑),计算每条边的yMin。在桶中寻找与该yMin 相应的桶结点,计算该边表的x|yMin、yMax、k(代表斜率倒数1/k),并依次连接该边表结点到桶结点。4对每个桶结点连接的边表,根据x|yMin值的大小进行排序,若 x|yMin相等,则按照k由小到大排序。

3、5对每个桶结点进行循环,将桶内每个结点的边表合并为有效边表,并进行有效边表循环。6从有效边表中取出相邻两条边的交点对进行填充。填充时设置一个逻辑变量In(初始值为假),每访问一个结点,把In值取反一次,若In为真,则把从当前结点的x值开始到下一结点的x1值结束的区间用指定颜色填充。(左闭右开)7循环下一桶结点,按照 xi+1=xi+k(k的值为1/k)修改有效边表,同时合并桶结点内的新边表,形成新的有效边表。8如果桶结点的扫描线值大于等于有效边表中某个结点的yMax值,则放弃该有效边表。9当桶结点不为空则转,否则删除桶结点和边结点的头结点,算法结束。4.源程序:1)/AET.h和AET.cpp

4、class AET 2)/Bucket.h和Bucket.cppclass Bucket 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 Edg

5、eOrder();/对AET表进行排序 。protected: COLORREF GetColor;/调色板 CPoint Point7;/定义多边形 Bucket *HeadB,*CurrentB;/桶的头结点和当前结点 AET ENumber,*HeadE,*CurrentE,*T1,*T2;/有效边表的结点4)/ TestView.cppCTestView:CTestView() /设置多边形的7个顶点 Point0=CPoint(550,400);/P0 Point1=CPoint(350,600);/P1 Point2=CPoint(250,350);/P2 Point3=CPoin

6、t(350,50);/P3 Point4=CPoint(500,250);/P4 Point5=CPoint(600,50);/P5 Point6=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-Text

7、Out(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();/初始化桶

8、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-ne

9、xt=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)/在桶内寻找该边的yMin CurrentB=CurrentB-next

10、;/移到下一个桶结点 Ei.x=Pointi.x;/计算AET表的值 Ei.yMax=Pointj.y; Ei.k=double(Pointj.x-Pointi.x)/(Pointj.y-Pointi.y);/代表1/k Ei.next=NULL; CurrentE=CurrentB-p;/获得桶上链接边表的地址 if(CurrentB-p=NULL)/当前桶结点上没有链接边结点 CurrentE=&Ei;/赋边的起始地址 CurrentB-p=CurrentE;/第一个边结点直接连接到对应的桶中 else /什么情况下会将不为空?当有两个点的纵坐标是一样的时候会产生这种情况,所以之后要对桶表

11、对应的边表中的每个结点进行按X的排序 while(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;

12、 if(CurrentE=NULL) CurrentE=&Ei; CurrentB-p=CurrentE; else while(CurrentE-next!=NULL) CurrentE=CurrentE-next; CurrentE-next=&Ei; CurrentB=NULL; CurrentE=NULL;void CTestView:AddEdge(AET *NewEdge)/插入临时边表函数 T1=HeadE; if(T1=NULL)/边表为空,将边表置为TempEdge T1=NewEdge; HeadE=T1; else while(T1-next!=NULL)/边表不为空,将TempEdge连在该边之后 T1=T1-next; T1-next=NewEdge; void CTestView:EdgeOrder()/对边表进行排序函数

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1