明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3086|回复: 2

反正切函数确定空间直线的方向角

[复制链接]
发表于 2006-12-25 13:48:00 | 显示全部楼层 |阅读模式

问题提出:在空间坐标系中,插入一图块需要的基本条件是,插入的空间坐标点,X,Y,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坐标轴的方向角。

请问各位大侠是否还有更好的几何解决方法。

发表于 2006-12-25 14:52:00 | 显示全部楼层

想法很好,但是算法可能可能复杂了一点:

我的建议:

已知两点pt1 (x1,y1,z1),pt2 (x2,y2,z2)

得到两点的矢量 (mapcar '- pt1 pt2) 即 dx ,dy, dz和两点的距离 L

则其方向角为 acos (dx/L) ,acos (dy/L) ,acos (dz/L)

acos为反余弦函数.

 楼主| 发表于 2006-12-26 09:36:00 | 显示全部楼层
本帖最后由 作者 于 2008-12-21 17:45:55 编辑

谢谢楼上给的思路,其解法如下
  1. Sub ll()
  2.   Dim objLine As AcadLine
  3.   Dim objCount As Integer
  4.   Dim rotateAngular As Double, rotateDegree As Double
  5.   Dim rotateAngularX As Double, rotateAngularY As Double, rotateAngularZ As Double
  6.   With ThisDrawing.ModelSpace
  7.     objCount = .Count
  8.     For ii = 0 To objCount - 1
  9.       Set objLine = .Item(ii)
  10.       With objLine
  11.         rotateAngularX = ACos(.Delta(0) / .Length)
  12.         Xx = RadToDeg(rotateAngularX)
  13.         rotateAngularY = ACos(.Delta(1) / .Length)
  14.         Yy = RadToDeg(rotateAngularY)
  15.         rotateAngularZ = ACos(.Delta(2) / .Length)
  16.         Zz = RadToDeg(rotateAngularZ)
  17.       End With
  18.     Next ii
  19.    
  20.    
  21.   End With
  22. End Sub
  23. Function ACos(ByVal Number As Double) As Double
  24.   If Number = 0 Then
  25.     ACos = 2 * Atn(1)
  26.   Else
  27.     ACos = Atn(-Number / Sqr(-Number * Number + 1)) + 2 * Atn(1)
  28.   End If
  29. End Function
  30. Function RadToDeg(Alfa As Double) As Double
  31.   RadToDeg = Alfa * 180 * Alfa / (Atn(1) * 4)
  32. End Function
-----------------------------------------------
L=SQR(dx^2+dy^2+dz^2),我用过这种方程。
方程解如下:
    alfa = (x - x1) / Sqr((x - x1) ^ 2 + (y - y1) ^ 2 + (z - z1) ^ 2)  
    beta = (y - y1) / Sqr((x - x1) ^ 2 + (y - y1) ^ 2 + (z - z1) ^ 2)
    theta = (z - z1) / Sqr((x - x1) ^ 2 + (y - y1) ^ 2 + (z - z1) ^ 2)

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-24 00:59 , Processed in 0.192717 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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