Bryco 发表于 2009-1-31 12:29:12

得到复合线上的极点

如果我有一条这样的线

LineStart= 1.0,1.0,0.0
LineEnd= 13.0,4.0,4.0
,我想从'LineStart'定义极点:
PtA= 4.0,1.75,1.0
PtB= 7.0,2.5,2.0
PtC= 10.0,3.25,3.0
我如何解决这个问题?
**** Hidden Message *****

Bryco 发表于 2009-1-31 12:50:02

平面可以包括任意3个点
可以制作满足该平面的ucs
然后您可以从wcs->ucs坐标转换点
现在它们都将具有相同的z值,polarpoint将起作用
现在将点转换回世界(wcs)
这不是最有效的解决方案,可能是需要最少数学知识的解决方案
你想用这些积分做什么?

Bryco 发表于 2009-1-31 12:58:30

取一条长度为一定长度的行,并将其分解为用户定义的较小长度。

Bryco 发表于 2009-1-31 13:07:03

不漂亮,但沿着这些路线的东西:
Public Sub PickPointsPipe()

    Dim objCirc As AcadCircle
    Dim dblOD As Double
    Dim varFtpt As Variant
    Dim varSdpt As Variant
    Dim objTempLine As AcadLine
    Dim dblDist As Double
   
    Dim dblRunLeng As Double
    Dim dblFullStk As Double
    Dim dblAngle As Double
    Dim varLastPt As Variant
   
    Dim objEnts() As AcadEntity
    Dim objPipe As Acad3DSolid
    Dim varRegions As Variant
    Dim varItem As Variant

On Error GoTo Done

With ThisDrawing
   varFtpt = .Utility.GetPoint(, vbCr & " Pick point to start pipe: ")
   varSdpt = .Utility.GetPoint(varFtpt, vbCr & " Pick point to end pipe: ")
   
   Dim dblVec(0 To 2) As Double
   dblVec(0) = varSdpt(0) - varFtpt(0): dblVec(1) = varSdpt(1) - varFtpt(1): dblVec(2) = varSdpt(2) - varFtpt(2)

   Dim dblVal As Double
   dblVal = Sqr(dblVec(0) * dblVec(0) + dblVec(1) * dblVec(1) + dblVec(2) * dblVec(2))

   Dim dblVecNorm(0 To 2) As Double
   dblVecNorm(0) = dblVec(0) / dblVal: dblVecNorm(1) = dblVec(1) / dblVal: dblVecNorm(2) = dblVec(2) / dblVal

End With
   
   With ThisDrawing
   
    Set objTempLine = .ModelSpace.AddLine(varFtpt, varSdpt)
    dblDist = objTempLine.Length
   
    dblRunLeng = 10#
    dblAngle = .Utility.AngleFromXAxis(varFtpt, varSdpt)
   
    dblFullStk = (dblDist / dblRunLeng)
    objTempLine.Delete
   varLastPt = .Utility.PolarPoint(varFtpt, dblAngle, dblRunLeng)
   
   
    Dim counter As Double
    counter = 1
    Do While dblFullStk > counter
      
       varLastPt = .Utility.PolarPoint(varFtpt, dblAngle, dblRunLeng)
       Set objTempLine = .ModelSpace.AddLine(varFtpt, varLastPt)
      
       Set objCirc = .ModelSpace.AddCircle(varFtpt, 1#)
       objCirc.Normal = dblVecNorm

    ReDim objEnts(0)
    Set objEnts(0) = objCirc
    varRegions = .ModelSpace.AddRegion(objEnts)
    Set objPipe = .ModelSpace.AddExtrudedSolid(varRegions(0), dblRunLeng, 0)
    objPipe.Update
    objTempLine.Delete
Debug.Print varLastPt(0) & "," & varLastPt(1) & "," & varLastPt(2)
varFtpt = varLastPt
   
    counter = counter + 1
    For Each varItem In objEnts
   varItem.Delete
Next
For Each varItem In varRegions
   varItem.Delete
Next
   
    Loop
End With

Done:
If Err Then MsgBox Err.Description
End Sub

Bryco 发表于 2009-1-31 16:07:29

X=X1+距离/长度*DX是您需要的数学,并且您已经在使用它。
不需要角度或极点
下面是一个示例
函数PointOnLineAt距离感(P1, P2, Dist As Double)As Variant
Dim P3(2)As Double
Dim dblL长度As Double
dblL长度=长度(P1, P2)
P3(0)=P1(0)+(Dist/dblL长度)*(P2(0)-P1(0))
P3(1)=P1(1)+(Dist/dblL长度)*(P2(1)-P1(1))
P3(2)=P1(2)+(Dist/dblL长度)*(P2(2)-P1(2))
PointOnLineAt远程=P3
结束函数

Bryco 发表于 2009-1-31 17:38:32

有时我看不到森林里的森林……谢谢你
我在发布我的东西时犹豫不决(因为它太分散了),我还在学习……很高兴我这么做了

Bryco 发表于 2009-1-31 17:58:28

我们都还在学习。
如果没有发布您的代码,我不会真正理解您的问题。
我经常尽力抵制插入临时对象来帮助计算的诱惑。
您可以轻松摆脱这条线。
页: [1]
查看完整版本: 得到复合线上的极点