乐筑天下

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

折线和数学

[复制链接]

3

主题

10

帖子

1

银币

初来乍到

Rank: 1

铜币
22
发表于 2007-3-18 01:02:35 | 显示全部楼层 |阅读模式
嗨,
我认为这主要是一个数学问题,但我在这里发布它,因为我需要一个VBA解决方案。
折线的一个属性是 。GetBulge,用于描述弧段。联机手册介绍了 。GetBulge 等于:“...所选顶点与折线顶点列表中下一个顶点之间的弧线的包含角度的 1/4 的正切值...“
我需要根据此信息建立弧段的半径和中心点。我以为我的三角。很合理,但我已经尝试了我能想到的一切,只是不知道如何去做。
DXF代码没有帮助,因为它们也只列出了凸起因素。
这显然是可能的,因为如果我“列出”折线,就会得到我需要的所有信息。
任何翻译此内容的帮助将不胜感激。
谢谢。

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2007-3-18 11:45:36 | 显示全部楼层
对凸出的更好描述是圆弧上升的切线/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

这看起来很冗长,但它针对x、y点(pline坐标)或x、y、z点进行了优化。
Kerry问了一个问题:“乘或使用^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

回复

使用道具 举报

12

主题

150

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
198
发表于 2007-3-18 11:55:53 | 显示全部楼层
打字时更好的代码...
回复

使用道具 举报

3

主题

10

帖子

1

银币

初来乍到

Rank: 1

铜币
22
发表于 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重写
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 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

回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2007-3-26 06:53:06 | 显示全部楼层
这个3D更新运行良好,将更加有用。
请注意,此更新的代码包括一个常量 - PI - 和一个函数 - Rd() - 不存在。 这没什么大不了的,但可能会阻止其他人使用代码。
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2007-3-26 23:02:22 | 显示全部楼层
修好了。
我几乎已经放弃了一次又一次地发布必须包含相同功能的代码。
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2007-3-27 06:21:56 | 显示全部楼层
我熟悉从本地DVB到论坛帖子(即。,http://discussion.autodesk.com/thread.jspa?messageID=17866)事实上,这篇示例文章有一些需要解决的问题
什么是使工作量最小化的最佳方法?是否建议将库文件(SEANTLib.bas)发布到Lilly Pond并随后引用?
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

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

© 2020-2025 乐筑天下

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