获取复合线上的极点
如果我有一条线,它是这样做的:LineStart=1.0,1.0,0.0,我想从'定义极点;线路起点和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)
这不是最有效的解决方案,它';这可能是最不需要数学知识的解决方案
你想用这些分数做什么? 取一条一定长度的线,将其拆分为用户定义的较小长度
不是很漂亮,但大致是这样的:
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+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结束函数 有时我看不见森林里的森林……谢谢你,我一直在犹豫是否要发布我所拥有的(因为它太分散了),我还在学习……很高兴我这么做了
我们都还在学习
如果不发布您的代码,我不会';我没有真正理解你的问题
我经常想方设法抵制插入临时对象来帮助数学的诱惑
你可以很容易地摆脱这条线。
页:
[1]