得到复合线上的极点
如果我有一条这样的线:
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 ***** 平面可以包括任意3个点
可以制作满足该平面的ucs
然后您可以从wcs->ucs坐标转换点
现在它们都将具有相同的z值,polarpoint将起作用
现在将点转换回世界(wcs)
这不是最有效的解决方案,可能是需要最少数学知识的解决方案
你想用这些积分做什么? 取一条长度为一定长度的行,并将其分解为用户定义的较小长度。
不漂亮,但沿着这些路线的东西:
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
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
结束函数 有时我看不到森林里的森林……谢谢你
我在发布我的东西时犹豫不决(因为它太分散了),我还在学习……很高兴我这么做了
我们都还在学习。
如果没有发布您的代码,我不会真正理解您的问题。
我经常尽力抵制插入临时对象来帮助计算的诱惑。
您可以轻松摆脱这条线。
页:
[1]