等高线光滑与过滤.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文档。上传文档
查看更多
等高线的光滑与过滤 王海超 郑先东 文章摘要: 在Cass软件有拟合与过滤功能但不能达到我们所要的效果,因此作者想到了另一种处理算法,下面我们来阐述这种算法。 文章关键词: 过滤。 等高线的光滑:光滑等高线有两个要求,第一是要保持等高线的原来位置不变,第二是不能有尖角。这是两个相互矛盾的要求,要满足这两个要求我们需要分两步走: 第一步:例如图1所示,我们还从等高线的当前点出发,设当前点为n,第二个点n+1,第三点n+2, 设n点坐标X0,Y0;设n+1的坐标为X1,Y1; 设n+2的坐标为X2,Y2;要把n+1点处的尖角去掉,取a边和b边中距离短的一边的四分之一(Dis),用这个距离作为参数求出n+1点附近处的两个点n+3,n+4。设n+3的坐标为X3,Y3;设n+4的坐标为X4,Y4.求n+3,n+4点坐标的公式如下: X3=X0+(X1-X0)*dis/a Y3=Y0+(Y1-Y0)*dis/a X4=X2+(X1-X2)*dis/b Y4=Y2+(Y1-Y2)*dis/b 图1 图2 说明一下:图2为去除尖角后的图,上面的“1/4”是个参数,作者在几次试验后发现用这个参数比较合理,既可以去掉尖角又不致超过限差的改变等高线的位置。在使用过程中我们可以多次使用此步,让等高线变得比较光滑。 第二步:使用3次B样拟合公式对等高线进行拟合处理,设等高线上的当前点为n,拟合公式为: T为小于等于1的参数,计算公式为:i/m,其中”i”为从”0”到”m”的变量,”m”为要添加的节点数目。 Px为横坐标点数组,Py为纵坐标点数组。 x,y为光滑后的等高线上的节点坐标。 上面的算法已用程序实现,以下为主要部分源代码: Sub CreateFittingLine() Dim Sset As AcadSelectionSet Dim filterType(0) As Integer Dim filterData(0) As Variant filterType(0) = 0 filterData(0) = *line On Error Resume Next If Not IsNull(ThisDrawing.SelectionSets.Item(Example)) Then Set Sset = ThisDrawing.SelectionSets.Item(Example) Sset.Delete End If Set Sset = ThisDrawing.SelectionSets.Add(Example) Sset.SelectOnScreen filterType, filterData Dim Obj As AcadEntity Dim k As Integer Dim a0, a1, a2, a3 As Integer 几个在闭合曲线中使用的参数 For k = 0 To Sset.count - 1 Set Obj = Sset.Item(k) 3次B样拟合算法 Dim Px() As Double Dim Py() As Double Dim i, j, m, n As Integer Dim T As Double Dim f0, f1, f2, f3 As Double Dim x, y As Double Dim gc As Long 等高线的高程 m = GetVertexCount(Obj) - 1 Dim Zb1() As Double Dim Zb2() As Double ReDim Zb1(2 * m + 1) As Double For i = 0 To m Zb1(2 * i) = Obj.Coordinate(i)(0) Zb1(2 * i + 1) = Obj.Coordinate(i)(1) Next i Call changeOneRoleToFour(Zb1, Zb2) 去除距离太近的点‘可以通过改变此函数中的距离参数来提高线的圆滑,可是有可能照成点线不一。把尖角变成4个角 m = (UBound(Zb2) + 1) / 2 - 1 现在有m+1个点 ReDim Px(m) As Double ReDim Py(m) As Double For i = 0 To m Px(i)

文档评论(0)

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

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

1亿VIP精品文档

相关文档