- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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)
您可能关注的文档
最近下载
- 教你如何破解软件OD破解软件OD使用教程.doc VIP
- 施工重大危险源辨识与防控措施月报表.pdf VIP
- 人教版(部编版)小学语文五年级上册 圆明园的毁灭第二课时 名师教学PPT课件.pptx VIP
- 一体机-柯尼卡美能达-bizhubC220说明书.pdf VIP
- BS EN 60079-32-2-2015 国外国际规范.pdf VIP
- 急诊科患者转运途中突然病情变化应急预案.pptx VIP
- G30连云港至霍尔果斯高速景家口至清水驿段扩容改造报告书.pdf VIP
- 股骨粗隆间骨折护理查房——护理问题及措施与健康指导.ppt VIP
- 零星工程 投标方案(技术方案).docx
- 一种比色法检测金黄色葡萄球菌活菌的Cu-MOF材料及其制备方法和应用.pdf VIP
文档评论(0)