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

获取复合线上的极点

如果我有一条线,它是这样做的:LineStart=1.0,1.0,0.0,我想从&#039定义极点;线路起点和039;在:PtA=4.0,1.75,1.0>PtB=7.0,2.5,2.0PtC=10.0,3.25,3.0 可以制作满足该平面的ucs
然后可以从wcs转换点->ucs坐标现在它们都将具有相同的z值,polarpoint将起作用
现在将点变换回世界(wcs)
这不是最有效的解决方案,它'这可能是最不需要数学知识的解决方案
你想用这些分数做什么?

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

取一条一定长度的线,将其拆分为用户定义的较小长度

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

不是很漂亮,但大致是这样的:
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 13:07:03

X=X1+distance/dLength*DX是您需要的数学,您已经在使用它了
不需要角度或极点,下面是一个示例,函数PointOnLineAtDistance(P1,P2,Dist为Double)作为变量 将P3(2)变暗为双精度 Dim dblLength为Double dblLength=长度(P1,P2) P3(0)=P1(0)+(距离/长度)*(P2(0)-P1(0))
 P3(1)=P1(1)+(距离/长度)*(P2(1)-P1(1))
 P3(2)=P1(2)+(距离/长度)*(P2(2)-P1(2))
 PointOnLineAtDistance=P3结束函数

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

有时我看不见森林里的森林……谢谢你,我一直在犹豫是否要发布我所拥有的(因为它太分散了),我还在学习……很高兴我这么做了

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

我们都还在学习
如果不发布您的代码,我不会'我没有真正理解你的问题
我经常想方设法抵制插入临时对象来帮助数学的诱惑
你可以很容易地摆脱这条线。
页: [1]
查看完整版本: 获取复合线上的极点