多段线与数学
嗨,我想这主要是一道数学题,但我';我张贴在这里,因为我需要一个VBA解决方案多段线的一个属性是.GetBulge,用于描述弧段。在线手册将.GetBulge描述为等于:“;。。。多段线中选定顶点和下一个顶点之间的圆弧夹角的1/4的切线#039;s顶点列表……”
我需要根据这些信息建立弧段的半径和中心点。我想我的三角。是合理的,但我';我试了我能想到的一切,但我能#039;我不知道怎么做
DXF代码没有帮助,因为它们也只列出了凸出因子
这显然是可能的,因为如果我;列表“;多段线显示了我需要的所有信息
我们将非常感谢您在翻译过程中提供的任何帮助。
谢谢。
更好的凸度描述是弧的切线#039;s上升/1/2段长度Function RadiusFromBulge(Bulge As Double, pt1, pt2) As Double
Dim Dist As Double, Rad As Double
Dist = 0.5 * Length(pt1, pt2)
RadiusFromBulge = Abs(Dist / Sin(Atn(Bulge) * 2))
End Function
Public Function CenterFromBulge(P1, P2, Bulge As Double)
If UBound(P1) = 1 Then
ReDim Preserve P1(2)
End If
If UBound(P2) = 1 Then
ReDim Preserve P2(2)
End If
Dim Ang As Double, CenPt(2) As Double
Dim Rad As Double, Dist As Double
Dist = Length(P1, P2) 'Use your length function
Rad = Abs(0.5 * Dist / Sin(Atn(Bulge) * 2))
Ang = ThisDrawing.Utility.AngleFromXAxis(P1, P2)
If Bulge > 0 Then
Ang = Ang + ((0.5 * pi) - (Atn(Bulge) * 2))
Else
Ang = Ang - ((0.5 * pi) + (Atn(Bulge) * 2))
End If
CenPt(0) = P1(0) + Cos(Ang) * Rad
CenPt(1) = P1(1) + Sin(Ang) * Rad
CenPt(2) = 0
CenterFromBulge = CenPt
End Function 这看起来很冗长,但它';s针对x、y点(pline坐标)进行了优化;或者x,y,z点
克里问了这个问题;乘法还是使用^2更好。使用乘法速度更快
Public Function Length(StartPoint As Variant, EndPoint As Variant) As Double
Dim Stx As Double, Sty As Double, Stz As Double
Dim Enx As Double, Eny As Double, Enz As Double
Dim dX As Double, dY As Double, Dz As Double
Dim i As Integer
If IsEmpty(StartPoint) Then Err.Raise 13
i = UBound(StartPoint)
If UBound(EndPoint) = i Then
If i > 0 Then
Stx = StartPoint(0): Sty = StartPoint(1)
Enx = EndPoint(0): Eny = EndPoint(1)
dX = Stx - Enx
dY = Sty - Eny
If i = 1 Then
Length = Sqr(dX * dX + dY * dY)
Else
Stz = StartPoint(2): Enz = EndPoint(2)
Dz = Stz - Enz
Length = Sqr((dX * dX) + (dY * dY) + (Dz * Dz))
End If
Else
Exit Function
End If
Else
Exit Function
End If
End Function
键入时,上面的代码更好。。。 谢谢Bryco,生活突然变得更加美好! 很好 ;这些都是有用的函数
它们似乎针对WCS进行了优化 ;是否认为与OCS之间的翻译是一个单独的程序的责任? 说得好,它需要重写为3d 3d版本Public Function CenterFromBulge(oPline As AcadLWPolyline, index As Integer) As Variant
If oPline Is Nothing Then Exit Function
If (UBound(oPline.Coordinates) - 1) / 20 Then
If Bulge > 1 Then
Ang = Ang - ((0.5 * pi) - (pi - BulgeAng))
Else
Ang = Ang + ((0.5 * pi) - BulgeAng)
End If
Else
If Bulge0 Then
dAng = 0
Else
dAng = pi '180
End If
ElseIf Rd(dX, 0) Then'Line is vertical
If dY > 0 Then
dAng = 0.5 * pi '90
Else
dAng = 1.5 * pi '270
End If
Else
dAng = Atn(dY / dX)
If dAng 270
If dX 270
dAng = pi + dAng '90->180
Else '270->360
dAng = 2 * pi + dAng
End If
Else
If dX 270
dAng = pi + dAng
End If
End If
End If
AngFromX = dAng
End Function
Function Rd(num1 As Variant, num2 As Variant) As Boolean
Dim dRet As Double
dRet = num1 - num2
If Abs(dRet) < 0.00000001 Then Rd = True
End Function
这个3D更新效果很好,甚至会更有用 
请注意,这个更新的代码包括一个常数-PI-和一个函数-Rd()-不存在 ;It#039;这没什么大不了的,但可能会阻止其他人使用代码。 已修复
I';我几乎放弃了发布代码,不得不一次又一次地包含相同的函数。 本人';I’我很熟悉成功的面试所需的努力;包装#039;n Go“;从本地DVB到论坛帖子(即。,http://discussion.autodesk.com/thread.jspa?messageID=17866)事实上,那个示例帖子有一些需要解决的问题
减少工作量的最佳方法是什么 ;是否建议将图书馆文件(SEANTLib.bas)张贴到礼来池并随后引用?
页:
[1]
2