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

折线和数学

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

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

对凸出的更好描述是圆弧上升的切线/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

DaveW 发表于 2007-3-18 11:55:53

打字时更好的代码...

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

谢谢Bryco,突然间生活似乎更加光明!

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

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

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

说得好,需要为3d重写

Bryco 发表于 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

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

这个3D更新运行良好,将更加有用。
请注意,此更新的代码包括一个常量 - PI - 和一个函数 - Rd() - 不存在。 这没什么大不了的,但可能会阻止其他人使用代码。

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

修好了。
我几乎已经放弃了一次又一次地发布必须包含相同功能的代码。

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

我熟悉从本地DVB到论坛帖子(即。,http://discussion.autodesk.com/thread.jspa?messageID=17866)事实上,这篇示例文章有一些需要解决的问题
什么是使工作量最小化的最佳方法?是否建议将库文件(SEANTLib.bas)发布到Lilly Pond并随后引用?
页: [1] 2
查看完整版本: 折线和数学