明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3264|回复: 5

[求助]圆和空间任意直线垂直公式

[复制链接]
发表于 2007-2-17 13:04:00 | 显示全部楼层 |阅读模式

要求见图,求一个通用公式,圆要与空间任意直线垂直的公式.

原因是在AutoCAD可中画圆,在X-Y平面完成,用VB处理UCS编程方法麻烦.有个数学公式,简单明了.

我现在做法比较麻烦,下面的例子用反正切方法,解绕Z轴得出公式

Function RotateZ_Axis(ByVal sPoint As Variant, ByVal ePoint As Variant) As Double
    Dim EntAngle As Double
    Dim deltaX As Double, deltaY As Double, deltaZ As Double
    deltaX = sPoint(0) - ePoint(0): deltaY = sPoint(1) - ePoint(1): deltaZ = sPoint(2) - ePoint(2):
     
    If deltaY >= 0 And deltaX > 0 Then
      EntAngle = Atn(deltaY / deltaX)
    ElseIf deltaY >= 0 And deltaX < 0 Then
      EntAngle = Pi + Atn(deltaY / deltaX)
    ElseIf deltaY < 0 And deltaX < 0 Then
      EntAngle = Pi + Atn(deltaY / deltaX)
    ElseIf deltaY < 0 And deltaX > 0 Then
      EntAngle = 2 * Pi + Atn(deltaY / deltaX)
    End If
   
    If deltaX = 0 Then
      If deltaY > 0 Then
        EntAngle = Pi / 2
      ElseIf deltaY > 0 Then
        EntAngle = Pi * 1.5
     End If
    End If
   
   
    RotateZ_Axis = EntAngle
End Function

Function RotateX_Axis(txtEnt As String) As Double
    Dim Ent As AcadLine
   
    Dim EntAngle As Double
    Set Ent = ThisDrawing.HandleToObject(txtEnt)
     
    If deltaY >= 0 And deltaX > 0 Then
      EntAngle = Atn(deltaY / deltaX)
    ElseIf deltaY >= 0 And deltaX < 0 Then
      EntAngle = Pi + Atn(deltaY / deltaX)
    ElseIf deltaY < 0 And deltaX < 0 Then
      EntAngle = Pi + Atn(deltaY / deltaX)
    ElseIf deltaY < 0 And deltaX > 0 Then
      EntAngle = 2 * Pi + Atn(deltaY / deltaX)
    End If
   
    If deltaX = 0 Then
      If deltaY > 0 Then
        EntAngle = Pi / 2
      ElseIf deltaY > 0 Then
        EntAngle = Pi * 1.5
     End If
    End If
   
   
    RotateZ_Axis = EntAngle
End Function

RotateZ_Axis,RotateX_Axis,RotateY_Axis返回的的是直线在X,Y,Z坐标轴的方向角。

L=SQR(dx^2+dy^2+dz^2)方程。

    alfa = (x - x1) / Sqr((x - x1) ^ 2 + (y - y1) ^ 2 + (z - z1) ^ 2)   绕X轴
    beta = (y - y1) / Sqr((x - x1) ^ 2 + (y - y1) ^ 2 + (z - z1) ^ 2)  绕Y轴
    theta = (z - z1) / Sqr((x - x1) ^ 2 + (y - y1) ^ 2 + (z - z1) ^ 2)  绕Z轴
也还需要很多判断语句

请教各位大侠是否还有其它什么公式可以一次性解决.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2007-2-17 14:41:00 | 显示全部楼层

这样也可以:

在XY平面画圆,再从圆心画平行与Z轴的直线作辅助线,然后用对齐命令使圆到位。

 楼主| 发表于 2007-2-17 20:11:00 | 显示全部楼层

这要用到3X3的矩阵,才能编程,在线段a-b外找一点c,过c点垂直线段a-b且交于线段a点??,才有解.通过a-c点,采用rotate3d point1,point2,Pi/2 才能实现.

我现在已经找到3X3矩阵公式,

形体的旋转变换有绕主轴旋转,或绕空间任一直线旋转等多种形式。若令Rθ表示绕z轴转θ角,Rβ表示绕y轴转β角,Rγ表示绕x轴转γ角,则点P绕x、y、z轴转γ、β、θ角的变换公式是
R=RθRβRγ
     |  cosθ   sinθ   0 |
Rθ= | -sinθ   cosθ    0  |
      |  0       0     1  |


     |  cosβ  -sinβ   0  |
Rβ= |   0     1     0   |
     |  sinβ  cosβ    1   |

     |  1     0       0   |
Rγ= |  0    cosγ   sinγ  |
     |  0     -sinγ  cosγ |

如何展开3X3矩阵公式,

X = 

Y =

Z = 

这是我的终极目标.

楼上所述,只能手动调试,不适合于编程.

 楼主| 发表于 2007-2-18 14:00:00 | 显示全部楼层

计算点到圆的最近距离及交点坐标:

如果该点在圆心,因为圆心到圆周任一点的距离相等,返回UNDEFINED

连接点P和圆心O,如果PO平行于X轴,则根据PO的左边还是右边计算出最近点的横坐标为centerPoint.x - radius centerPoint.x + radius。如果PO平行于Y轴,则根据PO的上边还是下边计算出最近点的纵坐标为 centerPoint.y -+radius centerPoint.y - radius。如果PO不平行于X轴和Y轴,则PO的斜率存在且不为0,这时直线PO斜率为k = P.y - O.y / ( P.x - O.x )。直线PO的方程为:y = k * ( x - P.x) + P.y。设圆方程为 x - O.x ) ^2 + ( y - O.y ) ^2 = r ^2,联立两方程组可以解出直线PO和圆的交点,取其中离P点较近的交点即可。

这是一种X-Y平面求交点的解法.

 楼主| 发表于 2007-2-21 12:22:00 | 显示全部楼层
本帖最后由 作者 于 2007-2-21 12:51:46 编辑

采用offset平移,作平行线方法,搞定效果见图。

 

offset 线段a-b与线段a'-b'平行,b-b'与a-b是垂直的。

现在关键问题是要找参数方程公式求解.省去建立临时线段和删除线段的无用功。

Function Rotate3dEntity(ByVal EnterEintity As Object, ByVal ll As Object) As Object
  Dim theta As Double
  Dim x As Double, x1 As Double, y As Double, y1 As Double, z As Double, z1 As Double
  Dim Point1 As Variant, Point2 As Variant
  Dim l1 As Object, l2 As Object
  'Dim Point1(0 To 2) As Double, Point2(0 To 2) As Double
  Point1 = ll.StartPoint
  Point2 = ll.EndPoint

  x = Point1(0): x1 = Point2(0)
  y = Point1(1): y1 = Point2(1)
  z = Point1(2): z1 = Point2(2)
'
  theta = (z - z1) / Sqr((x - x1) ^ 2 + (y - y1) ^ 2 + (z - z1) ^ 2)
  theta = Format(ArcCos(theta) - Pi / 2, "0.00")
  If Format(x - x1, "0.00") = 0 And Format(y - y1, "0.00") = 0 Then
   If z1 - z < 0 And Format(x - x1, "0.00") = 0# And Format(y - y1, "0.00") = 0# Then
     Point2(0) = Point2(0) + 2
     Point2(1) = Point2(1)
     Point2(2) = Point2(2)
     EnterEintity.Rotate3D ll.EndPoint, Point2, Pi
   End If
 
  ElseIf x - x1 <> 0 Or y - y1 <> 0 Then
   ll.Offset 10
   With obj_ModelSpace
     Set l1 = .Item(.Count - 1)
     Set l2 = .AddLine(ll.EndPoint, l1.EndPoint)
     l1.Delete
   End With
   If Format(z - z1, "0.00") = 0 Then
     EnterEintity.Rotate3D ll.EndPoint, l2.EndPoint, Pi / 2
   ElseIf z - z1 <> 0 Then
     EnterEintity.Rotate3D ll.EndPoint, l2.EndPoint, theta
     If z1 - z < 0 Then
       EnterEintity.Rotate3D ll.EndPoint, l2.EndPoint, Pi
     End If
   End If

   l2.Delete
 End If


End Function

 

Function lll()
' Dim Point1 As Variant, Point2 As Variant

 If boo = False Then
   AutoCADConnect
 End If
 Dim ll As Object, ss As Object, ReturnEntity As Object
 For Each ll In obj_ModelSpace
   If ll.objectname = "AcDbLine" Then
  
     Set ss = obj_ModelSpace.AddCone(ll.EndPoint, 3, 10)
     Set ReturnEntity = Rotate3dEntity(ss, ll)
   End If
 Next ll
 obj_Doc.Regen (0)
End Function

 

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2007-3-1 16:55:00 | 显示全部楼层
不好意思没有看明白
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 12:27 , Processed in 0.198739 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表