基于BMN算法几点改进.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于BMN算法几点改进

基于BMN算法几点改进   [摘要]交点算法是计算几何的一个基本算法,也是我们实现空间关系的一个基础。对BMN算法从两方面做改进,一方面单独解决BMN算法的5种特殊情况;另一方面是利用原有的数据结构而不是重新创建新的结构,这样带来效率优势和提高了可移植性。   [关键词]交点 BMN算法 BMN算法的改进   中图分类号:TP391文献标识码:A 文章编号:1671-7597(2008)1120133-02      一、引言      交点算法是计算几何的一个基本算法,也是我们实现空间关系的一个基础。交点算法可以分成两类:空间划分算法和空间排序算法。空间划分算法的思路是:把平面划分成为若干区域,这些区域之间没有重叠的部分,然后求得在每个区域内部线段的交点,空间排序算法是一种“输出敏感型”算法,即算法的复杂度和输出结果紧密的联系在一起,这类算法的时间复杂度的下限是O(n*logn+l),空间复杂度是O(n)。这类算法典型的有3种:BO算法,BMN算法,梯形扫描算法。   本文主要在BMN交点算法基础上作了改进,对BMN算法作了两方面的改进:特别的考虑了交点特殊情况的交迭,即针对重叠边和多线共点两种特殊情况的交迭的对BMN算法做了补充;改进了底层实现的数据结构,尽量用标准库的结构,而不是针对算法设计的特殊的数据结构,这极大提高了算法的适性和壮健性。      二、BMN算法      要保证BO算法的正确,必须对输入的线段做一些假定,这包括:(1)不存在垂直的线段(平行于扫描线SL);(2)不存在三线(或者更多线段)共点的情况;(3)线段的端点不能相等;(4)线段端点或者交点的x值不能相等;(5)不存在交迭(有公共边)的线段。   由于上面的五种情况在实际中存在的可能性很大,所以BO算法不能在实际中直接使用。很多的学者针对这些特殊的情况对BO算法提出了改进,其中最有名的是BMN算法。   BMN算法改进的主要思路是把特殊的情况和一般的情况同等看待,也就是说,上面BO算法所认为的特殊情况,在BMN算法看来是和一般情况一样的“一等公民”。BMN算法的改进有三个方面;   (1)X_Structure中事件点的全序关系   BO算法定义的事件点的全序关系,根据的是事件点的x值大小,BMN算法则根据事件点的字典的排序:首先比较点的x值大小,再比较y值的大小。经过这样的改进,算法可以处理第四种特殊情况,即线段端点或交点的x值相等。   (2)Y_Structure中线段的全序关系   BMN算法使用一个无穷小的概念从数学角度严格定义了扫描线SL;从算法的角度,可以认为BMN算法是用扫描点(或者说扫描射线)替代了扫描线的概念。每当遇到事件点的时候,扫描线就会改变,BO算法认为SL的改变仅依赖于事件点的y值,BMN算法则认为SL的改变依赖于整个事件点。   (3)多线相交   对于多线相交的情况,算法应该整体的交换它们的次序。从数据结构的角度来讲,为了满足算法的复杂度的要求,X_Structure和Y_Structure需要动态平衡二叉树结构。BMN算法的实现在文献中有详细的论述。      三、改进的BMN算法      BMN算法很好的解决了线段相交的特殊情况,但是在使用中我们也发现了一些不足,这主要体现在以下两个方面:1,BMN算法单独的解决了上面的5种特殊情况,但是在有些情况下,这些特殊情况会出现交迭,BMN算法并没有给予特别的考虑。2在数据结构方面,BMN算法使用了大量的私有数据结构,例如排序队列、加权队列等等,这限制了它的实际使用。由于BO算一法的核心数据结构是一个动态平衡二叉树,这在C++STL中已经存在,应该考虑使用这些结构,而不是重新构造,这样会带来更大的效率优势和可移植性。   我们首先考虑第一种情况,即特殊情况的交迭,如下图:      考虑图表1中的1,线段AB和线段CD存在重叠边,当扫描点到达C点的时候,BMN算法找到经过C点的所有线段AB和CD,然后输出AB和CD相交于C点;同样当扫描点到达B点的时候,会输出AB和CD相交于B点。一般来说,这正是我们期望的结果,我们并不期望输出的交点位于CB之间。   考虑图表1中的2,在图表1中的1的基础上添加了一条线段EF,恰好经过AB 与CD的公共边,交点是I。同样,C和B会作为AB和CD的交点输出。当扫描点到达I的时候,AB,CD和EF三条线段被查找到,I作为EF和AB,EF和CD的交点输出是正确的,但是作为AB和CD的交点输出一般就不是所期望的了。   要剔除这种情况,只要检查两条线段是否重叠,并且交点不是端点就可以了。   我们现在考虑第二个改进,即BMN算法的数据结构。   BO算法最复杂的结构是动态平衡

文档评论(0)

fangsheke66 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档