




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 多边形有效边表填充算法 案例效果如下: 具体实现: (1) 新建MFC项目: (2)分别添加类:AET 和Bucket 中定义在AET.h once #pragma AET class : public); AET( void); void AET( x; double yMax; int k; doubleAET * next; ; Bucket.h中定义在once #pragma#include AET.h class Bucket : public); Bucket(void); Bucket( void Scanline; int AET *p; Bucket * next; ; )
2、定义菜单3( (4)添加菜单处理程序 (5)定义视图头文件 / scanfillView.h : CscanfillView 类的接口/ once #pragma #include AET.h #include Bucket.h # define Number 7 class CscanfillView : public CView / protected: 仅从序列化创建CscanfillView(); DECLARE_DYNCREATE(CscanfillView) / 属性: public; CscanfillDoc* GetDocument() const 操作/ : public 上
3、闭下开填充多边形 PolygonFill(); /void void CreatBucket(); 建立桶节点 / void Et(); /构造边表 /将边插入AET表void AddEdge(AET *); /对AET 表进行排序void EdgeOrder(); / 重写: publicvirtual void OnDraw(CDC* pDC); / 重写以绘制该视图 virtual BOOL PreCreateWindow(CREATESTRUCT& cs); protected: BOOL OnPreparePrinting(CPrintInfo* pInfo); virtual On
4、BeginPrinting(CDC* pDC, CPrintInfo* pInfo); void virtual OnEndPrinting(CDC* pDC, CPrintInfo* pInfo); virtual void 实现/ : public CscanfillView(); virtual _DEBUG #ifdef; AssertValid() virtualvoidconst; virtual Dump(CDumpContext& dc) void const#endif : protected COLORREF GetColor; /调色板 CPoint Point7; /定
5、义多边形 Bucket * HeadB,*CurrentB; /桶的头结点和当前节点 有效边表的节点/AET ENumber,*HeadE,*CurrentE,*T1,*T2; / 生成的消息映射函数: protectedDECLARE_MESSAGE_MAP() : public OnMenuAET(); void afx_msg ; 中的调试版本#ifndef _DEBUG / scanfillView.cpp inline CscanfillDoc* CscanfillView:GetDocument() const return reinterpret_cast(m_pDocument
6、); #endif (6)实现视图 / scanfillView.cpp : CscanfillView 类的实现/ stdafx.h #include scanfill.h #include scanfillDoc.h #includescanfillView.h #include _DEBUG #ifdef DEBUG_NEW #define new#endif #define ROUND(a) int(a+0.5) /定义四舍五入 / CscanfillView IMPLEMENT_DYNCREATE(CscanfillView, CView) BEGIN_MESSAGE_MAP(Csc
7、anfillView, CView) / 标准打印命令 ON_COMMAND(ID_FILE_PRINT, &CView:OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView:OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView:OnFilePrintPreview) ON_COMMAND(ID_MenuAET, &CscanfillView:OnMenuAET) END_MESSAGE_MAP() / CscanfillView 构造析构/ CscanfillView:Cscanfill
8、View() / TODO: 在此处添加构造代码 设置多边形的个顶点/ Point0 = CPoint(550,400); Point1 = CPoint(350,600); Point2 = CPoint(250,350); Point3 = CPoint(350,50); Point4 = CPoint(500,250); Point5 = CPoint(600,50); Point6 = CPoint(800,450); CscanfillView:CscanfillView() BOOL CscanfillView:PreCreateWindow(CREATESTRUCT& cs) 在
9、此处通过修改/ TODO: 来修改窗口类或样式/ CREATESTRUCT cs CView:PreCreateWindow(cs); return / CscanfillView 绘制 CscanfillView:OnDraw(CDC* pDC) void CscanfillDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); (!pDoc) if ; return / TODO: 在此处为本机数据添加绘制代码 绘制多边形pDC-Polygon(Point,7); / pDC-TextOutW(550,410,_T(/停尰 ); 注意文本的输出); 停
10、就 pDC-TextOutW(350,600,_T(); pDC-TextOutW(230,340,_T(停尲 ); pDC-TextOutW(350,30,_T(停尳); pDC-TextOutW(490,220,_T(停尴); 停尵pDC-TextOutW(600,30,_T(); 停尶pDC-TextOutW(805,450,_T( / CscanfillView 打印 BOOL CscanfillView:OnPreparePrinting(CPrintInfo* pInfo) 默认准备 / DoPreparePrinting(pInfo); return ) CscanfillVie
11、w:OnBeginPrinting(CDC* /*pInfo*/*pDC*/, CPrintInfo* void 添加额外的打印前进行的初始化过程 / TODO: ) , CPrintInfo* /*pInfo*/void CscanfillView:OnEndPrinting(CDC* /*pDC*/ 添加打印后进行的清理过程/ TODO: 诊断/ CscanfillView _DEBUG #ifdefconst void CscanfillView:AssertValid() CView:AssertValid(); const void CscanfillView:Dump(CDumpC
12、ontext& dc) CView:Dump(dc); constCscanfillDoc* CscanfillView:GetDocument() / 非调试版本是内联的 ASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CscanfillDoc); (CscanfillDoc*)m_pDocument; return /_DEBUG #endif / CscanfillView 消息处理程序 /void CscanfillView:CreatBucket() 建立桶节点函数 ScanMin,ScanMax; int/确定扫描线的最小值和最大值ScanMax
13、 = ScanMin = Point0.y; i=1;iNumber;i+) int for( (Pointi.yScanMax) if 扫描线的最大值 /ScanMax = Pointi.y; (forint i=ScanMin;iScanline = ScanMin; CurrentB-p = NULL; / 没有连接边链表CurrentB-next = NULL; else / 建立桶的其他节点 新建一个桶节点 / Bucket; newCurrentB-next = 使 /CurrentB 指向新建的桶节点CurrentB = CurrentB-next; CurrentB-Scanl
14、ine = i; CurrentB-p = NULL; / 没有连接边链表 CurrentB-next = NULL; void CscanfillView:Et() 构造边表函数/ i=0;iPointi.y) if/终点比起点高 yMin /while(CurrentB-Scanline!=Pointi.y) 在桶内寻找该边的 移到下一个桶节点 / CurrentB = CurrentB-next; /Ei.x = Pointi.x; AET计算表的值 Ei.yMax = Pointj.y; (Pointj.x-Pointi.x)/(Pointj.y-Pointi.y); double E
15、i.k = ( Ei.next = NULL; / CurrentE = CurrentB-p; 获得桶上链接边表的地址 if /(CurrentB-p=NULL) 当前桶节点上没有链接边节点 赋边的起始地址/ CurrentE = &Ei; 第一个边节点直接连接到对应的桶中/ CurrentB-p=CurrentE; else while (CurrentE-next!=NULL) /如果当前边已有边节点 移动指针到当前边的最后一个节点/ CurrentE = CurrentE-next; 把当前边接上去/ CurrentE-next = &Ei; if终点比起点低 (Pointj.ySca
16、nline!=Pointj.y) while CurrentB = CurrentB-next; Ei.x = Pointj.x; Ei.yMax = Pointi.y; (Pointi.x-Pointj.x)/(Pointi.y-Pointj.y); doubleEi.k = ( Ei.next = NULL; CurrentE = CurrentB-p; (CurrentE = NULL) if CurrentE=&Ei; CurrentB-p = CurrentE; else (CurrentE-next!=NULL) while CurrentE = CurrentE-next; Cu
17、rrentE-next=&Ei; CurrentB = NULL; CurrentE = NULL; void/ CscanfillView:AddEdge(AET * NewEdge) 插入临时边表函数 T1 = HeadE; TempEdge if(T1 = NULL) /边表为空,将边表置为 T1 = NewEdge; HeadE =T1; else 连在该边之后边表不为空,将(T1-next!=NULL) while /TempEdge T1 = T1-next; T1-next = NewEdge; /void CscanfillView:EdgeOrder() 对边表进行排序 AE
18、T *F,*T; T1 = HeadE; (T1 = NULL) if ; return 如果该边表没有再连接边(T1-next= NULL) if / ; return else F =HeadE-next; HeadE-next = NULL; (F!=NULL) while (T=F, T1=HeadE; (T1!=NULL) & (T1-x x); T2=T1, T1=T1-next); for F = F-next; (T1 = HeadE) if HeadE = T; else T2-next = T; T-next = T1; void多边形填充函数 CscanfillView:
19、PolygonFill() / HeadE = NULL; 访问所有的桶节点for(CurrentB = HeadB;CurrentB!=NULL;CurrentB=CurrentB-next) / (CurrentE = CurrentB-p;CurrentE!=NULL;CurrentE = CurrentE-next) for 桶中所有边节点 / AET; new AET * TempEdge = TempEdge-x = CurrentE-x; TempEdge-yMax = CurrentE-yMax; TempEdge-k = CurrentE-k; TempEdge-next =
20、 NULL; 表 AET 将该边插入临时/AddEdge(TempEdge); 递增的顺序存放边表按照 EdgeOrder(); /x T1 = HeadE; yMax/根据 抛弃扫描完的边节点(T1 = NULL) if ; return AET/ (CurrentB-Scanline=T1-yMax) while放弃该节点,表指针后移,下闭上开 T1 = T1-next; HeadE = T1; (HeadE = NULL) if ; return (T1-next!=NULL) if T2 = T1; T1 = T2-next; (T1!=NULL) while if /跳过一个节点(CurrentB-Scanline=T1-yMax) T2-next = T1-next; T1-next = NULL; T1 =
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 节拍训练中的独特技巧乐理试题及答案
- 物理实效转化2025年试题及答案
- 如何解读创业扶持政策的新规试题及答案
- 绿色供应链在制造业中的绿色产品市场推广团队协作能力培养策略研究报告
- 河北单招全套试题及答案
- 教育直播平台2025年运营挑战与教育资源共享策略研究报告
- 农业灌溉用水高效利用与现代农业节水技术政策研究报告
- 量子通信技术在工业互联网平台中的数据加密与隐私保护预研报告
- 广东ps考证试题及答案解析
- 节水灌溉技术在农业中的应用成果鉴定报告2025
- 农村社区体育课件
- 江苏省南通市2024-2025学年高一上学期11月期中英语试题(无答案)
- 2024年“头脑奥林匹克万人大挑战”题库
- 智研咨询发布:2025年中国金针菜(黄花菜)行业市场全景调查及投资前景预测报告
- 医院定岗定编方案
- 保健推拿操作技术规范 第3部分:小儿DB41-T 1782.3-2019
- AIGC视域下非遗文创产品的数字化转型升级路径研究
- 七年级英语上册全册单元检测题(附听力材料及答案)
- -摩擦磨损试验机结构设计
- 高处安装维护拆除作业课件-改
- 6-1 矩形纯扭构件的破坏特征和承载力计算讲解
评论
0/150
提交评论