乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 153|回复: 10

多段线与数学

[复制链接]

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2007-3-18 01:02:35 | 显示全部楼层 |阅读模式
嗨,我想这主要是一道数学题,但我'我张贴在这里,因为我需要一个VBA解决方案
多段线的一个属性是.GetBulge,用于描述弧段。在线手册将.GetBulge描述为等于:“;。。。多段线中选定顶点和下一个顶点之间的圆弧夹角的1/4的切线#039;s顶点列表……”
我需要根据这些信息建立弧段的半径和中心点。我想我的三角。是合理的,但我'我试了我能想到的一切,但我能#039;我不知道怎么做
DXF代码没有帮助,因为它们也只列出了凸出因子
这显然是可能的,因为如果我;列表“;多段线显示了我需要的所有信息
我们将非常感谢您在翻译过程中提供的任何帮助。
谢谢。
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2007-3-18 11:45:36 | 显示全部楼层
更好的凸度描述是弧的切线#039;s上升/1/2段长度
  1. Function RadiusFromBulge(Bulge As Double, pt1, pt2) As Double
  2.     Dim Dist As Double, Rad As Double
  3.     Dist = 0.5 * Length(pt1, pt2)
  4.     RadiusFromBulge = Abs(Dist / Sin(Atn(Bulge) * 2))
  5. End Function
  1. Public Function CenterFromBulge(P1, P2, Bulge As Double)
  2.    
  3.     If UBound(P1) = 1 Then
  4.         ReDim Preserve P1(2)
  5.     End If
  6.     If UBound(P2) = 1 Then
  7.         ReDim Preserve P2(2)
  8.     End If
  9.     Dim Ang As Double, CenPt(2) As Double
  10.     Dim Rad As Double, Dist As Double
  11.     Dist = Length(P1, P2) 'Use your length function
  12.     Rad = Abs(0.5 * Dist / Sin(Atn(Bulge) * 2))
  13.     Ang = ThisDrawing.Utility.AngleFromXAxis(P1, P2)
  14.     If Bulge > 0 Then
  15.         Ang = Ang + ((0.5 * pi) - (Atn(Bulge) * 2))
  16.     Else
  17.         Ang = Ang - ((0.5 * pi) + (Atn(Bulge) * 2))
  18.     End If
  19.     CenPt(0) = P1(0) + Cos(Ang) * Rad
  20.     CenPt(1) = P1(1) + Sin(Ang) * Rad
  21.     CenPt(2) = 0
  22.     CenterFromBulge = CenPt
  23. End Function
这看起来很冗长,但它's针对x、y点(pline坐标)进行了优化;或者x,y,z点
克里问了这个问题;乘法还是使用^2更好。使用乘法速度更快
  1. Public Function Length(StartPoint As Variant, EndPoint As Variant) As Double
  2.     Dim Stx As Double, Sty As Double, Stz As Double
  3.     Dim Enx As Double, Eny As Double, Enz As Double
  4.     Dim dX As Double, dY As Double, Dz As Double
  5.     Dim i As Integer
  6.     If IsEmpty(StartPoint) Then Err.Raise 13
  7.     i = UBound(StartPoint)
  8.     If UBound(EndPoint) = i Then
  9.         If i > 0 Then
  10.             Stx = StartPoint(0): Sty = StartPoint(1)
  11.             Enx = EndPoint(0): Eny = EndPoint(1)
  12.             dX = Stx - Enx
  13.             dY = Sty - Eny
  14.             If i = 1 Then
  15.                 Length = Sqr(dX * dX + dY * dY)
  16.             Else
  17.                 Stz = StartPoint(2): Enz = EndPoint(2)
  18.                 Dz = Stz - Enz
  19.                 Length = Sqr((dX * dX) + (dY * dY) + (Dz * Dz))
  20.             End If
  21.         Else
  22.             Exit Function
  23.         End If
  24.     Else
  25.         Exit Function
  26.     End If
  27. End Function
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2007-3-18 11:55:53 | 显示全部楼层
键入时,上面的代码更好。。。
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2007-3-19 04:52:50 | 显示全部楼层
谢谢Bryco,生活突然变得更加美好!
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2007-3-19 06:15:24 | 显示全部楼层
很好 这些都是有用的函数
它们似乎针对WCS进行了优化 是否认为与OCS之间的翻译是一个单独的程序的责任?
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2007-3-19 10:41:55 | 显示全部楼层
说得好,它需要重写为3d
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2007-3-24 12:47:17 | 显示全部楼层
3d版本
  1. Public Function CenterFromBulge(oPline As AcadLWPolyline, index As Integer) As Variant
  2.     If oPline Is Nothing Then Exit Function
  3.     If (UBound(oPline.Coordinates) - 1) / 2  0 Then
  4.         If Bulge > 1 Then
  5.             Ang = Ang - ((0.5 * pi) - (pi - BulgeAng))
  6.         Else
  7.             Ang = Ang + ((0.5 * pi) - BulgeAng)
  8.         End If
  9.     Else
  10.         If Bulge  0 Then
  11.             dAng = 0
  12.         Else
  13.             dAng = pi '180
  14.         End If
  15.     ElseIf Rd(dX, 0) Then  'Line is vertical
  16.         If dY > 0 Then
  17.             dAng = 0.5 * pi '90
  18.         Else
  19.             dAng = 1.5 * pi '270
  20.         End If
  21.     Else
  22.         dAng = Atn(dY / dX)
  23.         If dAng 270
  24.             If dX 270
  25.                 dAng = pi + dAng '90->180
  26.             Else '270->360
  27.                 dAng = 2 * pi + dAng
  28.             End If
  29.         Else
  30.             If dX 270
  31.                 dAng = pi + dAng
  32.             End If
  33.         End If
  34.     End If
  35.     AngFromX = dAng
  36. End Function
  37. Function Rd(num1 As Variant, num2 As Variant) As Boolean
  38.     Dim dRet As Double
  39.     dRet = num1 - num2
  40.     If Abs(dRet) < 0.00000001 Then Rd = True
  41. End Function
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2007-3-26 06:53:06 | 显示全部楼层
这个3D更新效果很好,甚至会更有用&nbsp
请注意,这个更新的代码包括一个常数-PI-和一个函数-Rd()-不存在&nbsp;It#039;这没什么大不了的,但可能会阻止其他人使用代码。
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2007-3-26 23:02:22 | 显示全部楼层
已修复
I&#039;我几乎放弃了发布代码,不得不一次又一次地包含相同的函数。
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2007-3-27 06:21:56 | 显示全部楼层
本人&#039;I’我很熟悉成功的面试所需的努力;包装#039;n Go“;从本地DVB到论坛帖子(即。,http://discussion.autodesk.com/thread.jspa?messageID=17866)事实上,那个示例帖子有一些需要解决的问题
减少工作量的最佳方法是什么&nbsp;是否建议将图书馆文件(SEANTLib.bas)张贴到礼来池并随后引用?
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-7-7 14:25 , Processed in 0.682181 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表