Bryco 发表于 2007-3-18 01:02:35

多段线与数学

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

SEANT 发表于 2007-3-18 11:45:36

更好的凸度描述是弧的切线#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 发表于 2007-3-18 11:55:53

键入时,上面的代码更好。。。

Bryco 发表于 2007-3-19 04:52:50

谢谢Bryco,生活突然变得更加美好!

SEANT 发表于 2007-3-19 06:15:24

很好 这些都是有用的函数
它们似乎针对WCS进行了优化 是否认为与OCS之间的翻译是一个单独的程序的责任?

Bryco 发表于 2007-3-19 10:41:55

说得好,它需要重写为3d

SEANT 发表于 2007-3-24 12:47:17

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

Bryco 发表于 2007-3-26 06:53:06

这个3D更新效果很好,甚至会更有用&nbsp
请注意,这个更新的代码包括一个常数-PI-和一个函数-Rd()-不存在&nbsp;It#039;这没什么大不了的,但可能会阻止其他人使用代码。

Bryco 发表于 2007-3-26 23:02:22

已修复
I&#039;我几乎放弃了发布代码,不得不一次又一次地包含相同的函数。

Bryco 发表于 2007-3-27 06:21:56

本人&#039;I’我很熟悉成功的面试所需的努力;包装#039;n Go“;从本地DVB到论坛帖子(即。,http://discussion.autodesk.com/thread.jspa?messageID=17866)事实上,那个示例帖子有一些需要解决的问题
减少工作量的最佳方法是什么&nbsp;是否建议将图书馆文件(SEANTLib.bas)张贴到礼来池并随后引用?
页: [1] 2
查看完整版本: 多段线与数学