欢迎来到天天文库
浏览记录
ID:59265702
大小:24.21 KB
页数:4页
时间:2020-09-08
《(孙一璠)GIS基础算法实习报告电子版.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、实习一凸壳生成实习目的①通过给定的离散点集,结合矢量的叉积、点积运算,获取对应凸壳。②结合上学期VC实习,了解VC/VS的类及绘图中基本坐标变换知识。实习原理离散点集的凸壳计算是很多运算的基础。凸壳,可以看作是点集合的边界,连接凸壳点所得到的凸多边形完全包含了空间中的所有点。生成凸壳的方法非常多,这里取其中较为简单的一种思路即卷积法:首先找到一个y最小值点,以该点为起始点,做一条射线让射线从从水平方向开始逆时针旋转,该射线触碰到的第一个点即为下一个凸壳点,以该点为新的起始点,重复以上步骤,直到下一个凸壳点和y最小值点重合
2、。值得注意的是从第二个点开始,射线的起始方向不再是水平方向,而是上一凸壳点与当前点连线方向。实习步骤①通过MFCAppWizard创建单文档工程文件②在工程中添加自定义凸壳类(CConvexHull),该类的成员变量主要包括用于存储离散点集坐标串的pts,用于存储凸壳坐标串的Chpts,用于存储点集外接矩形的crWCRect。另外该类有两个方法,一个是用于获取点集凸壳的getConvexHull函数,另一个是用于绘制点集和凸壳的Draw函数。③在view部分添加凸壳类的对象,在doc部分添加数据读取函数,完成数据读取,在
3、读取同时生成坐标范围并付给crWCect。④在view中添加OnPrepareDC实现坐标的变换和映射,并在OnDraw部分添加凸壳的绘制函数。⑤完善凸壳获取和凸壳绘制函数。实习分析这一次实习有两个目的,第一就是了解MFC程序的基本框架,这个是之后所有实习的基础,也是GIS实习能教会我的最重要的东西之一。第二是实现凸壳函数,完善程序。从实习过程和结果来看,本次实习圆满完成了预定的目标。由于基本步骤老师已经给出程序,因此主要难点在于凸壳算法的实现。MFC单文档中主要有CAboutDlg/CCGExeApp/CCGExeDo
4、c/CCGExeView/CMainFrame五个基本类,其中Doc和View是在整个实习中需要较多接触修改的部分,其中Doc部分存有文件读取的函数,而一切需要绘制的内容都需要在View中完成。对于一个空白的工程,要实现我们的目的其核心步骤为“设置坐标变换与映射,实现WC->DC的过程”、“根据具体需求读取文件”、“自定义类并实现核心函数”、“在OnDraw中创建并调用相关对象,实现绘制”。由于对于MFC流程的不熟悉,我在完成这些工作上耗费了大量精力,不过最终掌握了这一套开发流程是值得的。在实习的途中,我还将使用的平台从
5、VC变更为了VS体会到了两种平台的优势。在实现凸壳算法时,我最终选定了卷积法。在实现途中,由于思路的不清晰和C++语法的不熟练,我浪费了大量时间。其中印象最为深刻的部分是:“从第二个点开始,射线的起始方向不再是水平方向,而是上一凸壳点与当前点连线方向。”实习二图形裁切实习目的①通过对给定数据的窗口裁切,深入了解其内部快速排除机制、裁切实现、数据存储等②了解图形表达的主要方法实习原理其核心是剪裁函数的实现。剪裁的目的是“判断图形元素是否落在裁剪窗口之内并找出其位于内部的部分“,剪裁的处理基础是”图元关于窗口内外关系的判别“
6、和”图元与窗口的求交“,剪裁的假定条件是”矩形剪裁窗口“和”待剪裁线段“。这里采用Cohen-Sutherland直线裁剪算法,其基本算法思想是将每条线段P1P2按与窗口的关系,分成完全在、不完全在、完全不在三类。将不完全在线段分成两段,其中一段在窗口外可以丢弃,对另一端重复操作。在判断线段关系的时候,采用区域码。区域码是表示直线端点相对位置的4位二进制代码。四位依次为上下右左,其判别关系如下图所示。若code1=0且code2=0,P1P2明显在窗口内,则“取”;若code1&code2≠0,P1P2明显在窗口外,则“
7、弃”;对于两个条件都不满足的线段,在必定不完全在窗口内,这时求其余窗口边界的交点即可。 实习步骤①创建空间类系列,主要有CGeoMap,CGeoLayer,CGeoPolyline三个类,其从属关系为一个Map包含多个Layer,一个Layer包含多个Polyline,一个Polyline包含多个Point。处理了一些基本的成员变量外,这些类具有用于绘制原图及裁切后图形的draw方法、用于添加下级对象的add方法、和利用给定矩形裁切图形的clip方法。②修改doc中的数据读取方法,读取的数据结构为”前两行为数据区域限制,
8、之后为线段数据,线段数据包括线段组成点数和点坐标两个部分“。③实现clip和draw方法,完善细节。④在view中添加CGeoMap对象,在OnDraw中添加相关代码实现绘制。⑤编译运行并打开clipdata查看效果。实习分析虽然中途出现了不知名错误,但重做后完成了既定目标,实现了指定窗口的剪裁。本次实习的难点有两个
此文档下载收益归作者所有