折线和数学
嗨,我认为这主要是一个数学问题,但我在这里发布它,因为我需要一个VBA解决方案。
折线的一个属性是 。GetBulge,用于描述弧段。联机手册介绍了 。GetBulge 等于:“...所选顶点与折线顶点列表中下一个顶点之间的弧线的包含角度的 1/4 的正切值...“
我需要根据此信息建立弧段的半径和中心点。我以为我的三角。很合理,但我已经尝试了我能想到的一切,只是不知道如何去做。
DXF代码没有帮助,因为它们也只列出了凸起因素。
这显然是可能的,因为如果我“列出”折线,就会得到我需要的所有信息。
任何翻译此内容的帮助将不胜感激。
谢谢。
**** Hidden Message ***** 对凸出的更好描述是圆弧上升的切线/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
这看起来很冗长,但它针对x、y点(pline坐标)或x、y、z点进行了优化。
Kerry问了一个问题:“乘或使用^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() - 不存在。 这没什么大不了的,但可能会阻止其他人使用代码。 修好了。
我几乎已经放弃了一次又一次地发布必须包含相同功能的代码。 我熟悉从本地DVB到论坛帖子(即。,http://discussion.autodesk.com/thread.jspa?messageID=17866)事实上,这篇示例文章有一些需要解决的问题
什么是使工作量最小化的最佳方法?是否建议将库文件(SEANTLib.bas)发布到Lilly Pond并随后引用?
页:
[1]
2