- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
稿绠瀹绋婕璁澶涓璁璁虹郴楂芥璁虹郴楂芥惧绋婕璇存绋璁捐矾甯瀹涓釜甯氦浜绠婕绋锛杈寰稿绠璁稿锛苟灏绠剁杩杩涓淮骞宠绐涓绀恒婕绋卞绔涓釜缁锛绔风杈淇锛杩璋绋寰锛苟灏绠绋腑涓楠瀹椤哄涓绠涓绠瀹璁褰归瀵瑰稿骞灏规楠互舰寮瀛绋姒涓归瀵瑰稿涓钩琛缁跺搴褰骞宠抽姒绋璇存负宸涓釜锛乏负杈哄锛浠杩涓涓圭浣疆负骞宠绀哄剧褰稿涓椤瑰骞宠缃绋浜绉绀烘寮妯存剧扮稿钩琛褰锛妯妯剧储杩涓涓荤涓妯互绋腑镐绋杩渚涓锛濡搴互存扮瑙版绱浣楠杩姝浠翠缁姣瀹涓妫浠浜娉婕瑰帮婕绋瀹浜骞宠绀虹浜骞叉涓楠涓妫逛浠浜绀恒姣釜圭棰涓锛竟涓褰涓锛互
动态凸包最优算法实现及
程序演示
计算几何大作业
2015-6-14
计研142 班 范 典 2014210896
计算机系高性能所 杨 珂 2014310561
计算机系高性能所 曾开胜 2014210957
1.程序演示说明
程序设计思路
希望实现一个带界面交互的 REALTIME CONVEX HULL 算法演示程序,由用户
输入待求凸包的点集,分别采用OPTIMAL 及DYNAMIC 算法计算凸包,并将运算
的实时结果与运算过程中维护的平衡树在窗口中显示。
演示程序由前端和后端两个部分组成,前端采集用户的输入信息,通过接口
调用后端程序得到反馈,并将运算过程中的每个步骤按照一定的顺序呈现在界面
中。后端算法接受前端界面的调用,通过两种算法实时计算当前点集对应凸包并
将重点步骤以SNAPSHOT 的形式储存。
程序界面概览
图 1 一组点集及其对应凸包与当前平衡树
图 2 另一组点集及其对应凸包与当前平衡树
图 3 右键菜单支持功能概览
程序功能说明
前端分为左右两个部分,左半部分为用户输入区域,可以通过鼠标点击
指定下一个顶点的位置。右半部分为平衡树显示区域,显示当前凸包上各顶
点在平衡树上的位置。
程序提供了三种显示模式,REALTIME 模式直接显示新生成的凸包及平衡
树的形状,DYNAMIC 模式和OPTIMAL 模式逐步显示搜索过程中每个时刻的变
化,三种模式可以在过程中随时相互切换。
程序还提供了一些附加功能,比如速度调节,可以更清晰的观察到搜索
的具体步骤,还支持单步的重放以及整体的重绘,功能比较完整且鲁棒,可
以用于凸包算法的教学演示。
特别地,演示程序实现了输入点集与平衡树显示的互不干扰。每个步骤
中被检查的关键顶点予以高亮显示。每个点的颜色不同,边界点与内部点的
形状不同,以此进行区分。平衡树高度可以自适应调整等。
程序后端实现了两种不同复杂度的动态凸包算法,具体内容将在第二节
中进行详细的描述。
编程环境说明
演示程序使用 C++编程。大部分后端程序在 Linux 环境调试,前端显示部分
在WINDOWS 下使用VS2012 平台配合OPENGL3.7 完成。
2.算法原理
静态二维凸包算法
凸包(Convex Hull)是一个计算几何(图形学)中的概念。一组平面上
的点,求一个包含所有点的最小的凸多边形,这就是凸包问题了。这可以形
象地想成这样:在地上放置一些不可移动的木桩,用一根绳子把他们尽量紧
地圈起来,并且为凸边形,这就是凸包了。在二维欧几里得空间中,凸包可
想象为一条刚好包著所有点的橡皮圈。用不严谨的话来讲,给定二维平面上
的点集,凸包就是将最外层的点连接起来构成的凸多边型,它能包含点集中
所有点的 (具体的例子如图一所示)。
图一 凸包示例
事先给定一个点集合P,在求出这个集合的凸包,这样的问题由于不涉及动
态的点插入,所以称为静态二维凸包问题。针对这个问题现在以有成熟的算法在
O(nlgn)的时间复杂度下解决,下面将对这类算法做简单介绍。
Grahams Scan 算法
这个算法是由数学大师Graham 提出的,算法的具体实现步骤分为以下三个
部分:
(1)在所有点中选取y 坐标最小的一点H,当作基点。如果存在多个点的y 坐
标都为最小值,则选取x 坐标最小的一点。坐标相同的点应排除。然后按照其它
各点 p 和基点构成的向量H,p ;与x 轴的夹角进行排序,夹角由大至小进行顺
时针扫描,反之则进行逆时针扫描。实现中无需求得夹角,只需根据余弦定理求
出向量夹角的余弦值即可。以图二为例,基点为H,根据夹角由小至大排序后依
次为H,K,C,D,L,F,G,E,I,B,A ,J 。下面进行逆时针扫描。
文档评论(0)