多边形的偏移填充算法.doc

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
多边形的偏移填充算法多边形偏移(polygon offset)算法可能我们印象不深,不过用过autoCAD的同学也印象autoCAD上面也还是有这个功能的。我们可以用autoCAD上的“正多边形”功能画一个多边形,然后用修改工具中“偏移”按钮,对多边形进行偏移,见图1,从外面的一个大的5边形按照边偏移至里面小的5边形,其中相应边偏移的距离定义为offset值。 图1 AutoCAD中的多边形偏移效果图 ? ? ? ? 当然,这只是简单的情况,复杂的情况可能是有多个多边形,其中1个outer多边形,多个inner多边形,然后offset的时候应该是outer多边形向内offset,inner多边形向外offset。当一个多边形(特别是凹多边形)初步offset时,可能会发生自交;然后多边形之间也可能会发生相交。大概思路:这里就需要首先将自交的多边形分裂出来,并选择正确的多边形;然后将选择出来的多边形进行求交计算,再一次将有相交的多边形合并分裂出来,并且选择正确的多边形,这个时候得到的全部多边形就是一次offset出来的结果。 1、为了保证outer多边形能向内offset,inner多边形能向外offset,这里需要保证outer多边形是逆时针方向旋转的,inner多边形是顺时针方向旋转的。 1.1 这里就稍稍讲下多边形的顺逆判断。 在多边形是简单多边形的前提下,其实还是挺简单的,只要找出多边形左下角的一个顶点,然后判断与这个顶点相连的两条边的叉积是否大于0就行了;如果多边形不是简单多边形,比如有自相交,有顶点夹角为0的情况等等,这个时候多边形就不应该有顺逆这种属性吧 2、对单个多边形,根据角平分线初步偏移得到角点 对于一个角点,可以设这个顶点为curPoint,相连的前一个点为prePoint,下一个点为nexPoint,于是可以得到两个向量a = prePoint – curPoint,b=nexPoint – curPoint。将向量a和b设置为单位向量之后,相加就能得到角平分线的方向向量c。然后对单位向量a和b做点乘和叉乘,就能得到这个角度的cos和sin值了,我们假设这个角度的一般为Θ,则cos=cos2Θ,sin=sin2Θ。根据三角函数,就能得到sinΘ值,之后将就能得到该顶点的角平分线方向的偏移向量d=c/|c|×offset÷sinΘ。 3、考虑到有些边在偏移的过程中会消失,即一些边有退化的offset值,见图3。如果初步偏移的值大于它的退化offset值,则该边就会反向出现,见图3中的边【4,5】,会给后面的程序带来很大的麻烦。 图2 图3 ? ? ? ? ?由此对于一个特定的offset值,需要当前多边形每条边的退化offset值,当然有些边是没有退化offset值的,比如凸的inner多边形,offset的时候是向外扩张的,如果没有outer多边形限制的话,是不会结束offset的。我们就假设被有退化offset值的边的offset值为无穷大。而对于会退化的边来说,只需要将该边的两个顶点做的角平分线做求交计算得到交点,计算该交点到边的距离就得到这条边的退化offset值了。由此遍历每条边,得到最大的offset值和最小的offset值。 3.1、如果当前的offset值≥最大的退化offset值,多边形的offset操作就结束了 3.2、如果当前offset值≤最小的退化offset值,那就直接使用当前offset值做角平分线求初步offset角点 3.3、如果当前offset值在最小和最大退化offset值之间,则先使用最小offset值做初步offset角点,然后将当前offset值减去最小offset值,并重新计算全部的边的最小和最大offset值,重复上面过程,直至当前offset值≤最小offset值,进入3.2 4、第3步之后,多边形的初步offset已经完成,并且不存在反向边的情况。但此时的多边形可能存在自相交的情况以及顶点夹角为0的情况,见图4,5。 图4 初步偏移多边形自相交 图5 初步偏移多边形的一个顶点夹角为0 ? ? ? ? ?4.1 检测顶点夹角为0的全部顶点,并将该点以及相关的边分裂出来 4.2 计算多边形的每条边的相交关系,并将全部的交点信息记录下来,其中包含交点坐标point(x, y),交点在所在的两条边的id0和id1,交点在两条边的位置rate0,rate1,其中point = edge0.Start+(edge0.End-edge0.Start)*rate0=edge1.Start+(edge1.End-edge1.Start)*rate1; 4.3 以其中一个初步偏移多边形的顶点为起点,顺着多边形的方向开始行进,遇到交点则行进方向改变,跳到交点

文档评论(0)

此项为空 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档