明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2511|回复: 10

點坐標進行3d轉動怎麼計算?

[复制链接]
发表于 2005-2-1 20:34:00 | 显示全部楼层 |阅读模式
如题:         我有一个点坐标值是 (150        55 100)         , 我想把这个点绕x轴正转90度后的坐标值求出来. 不知用什么方法??



         
平时我们用的polar 涵数都是用来指定X Y 平面的夹角来算点的. 可到3D旋转的可把我难到了. 没有做过. 不太了解. 所以请教各位大侠了
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2005-2-2 17:14:00 | 显示全部楼层
考学数吗?
  1. ;;这是3个旋转物件程序,ROTX ROTY ROTZ,
  2. ;;其中用了EA网友的矩阵平移
  3. (defun C:ROTX (/ E C B)
  4.    (setq E (car (entsel)))
  5.    (setq C (getpoint "\n指定基准点: "))
  6.    (setq B (getreal "\n指定旋转角度: "))
  7.    (MATRIX_T E C B 'M_MX_BLKX)
  8.    (princ)
  9. )(defun M_MX_BLKX (IP SX SY SZ RT)
  10.    (list
  11.        (list SX 0.0 0.0 (car IP))
  12.        (list 0.0 (* SY (cos RT)) (* SZ -1.0 (sin RT)) (cadr IP))
  13.        (list 0.0 (* SY (sin RT)) (* SZ (cos RT)) (caddr IP))
  14.        (list 0.0 0.0 0.0 1.0)
  15.    )
  16. );;----------------------------------------------------------
  17. (defun C:ROTY (/ E C B)
  18.    (setq E (car (entsel)))
  19.    (setq C (getpoint "\n指定基准点: "))
  20.    (setq B (getreal "\n指定旋转角度: "))
  21.    (MATRIX_T E C B 'M_MX_BLKY)
  22.    (princ)
  23. )(defun M_MX_BLKY (IP SX SY SZ RT)
  24.    (list
  25.        (list (* SX (cos RT)) 0.0 (* SZ (sin RT)) (car IP))
  26.        (list 0.0 SY 0.0 (cadr IP))
  27.        (list (* SX -1.0 (sin RT)) 0.0 (* SZ (cos RT)) (caddr IP))
  28.        (list 0.0 0.0 0.0 1.0)
  29.    )
  30. );;----------------------------------------------------------
  31. (defun C:ROTZ (/ E C B)
  32.    (setq E (car (entsel)))
  33.    (setq C (getpoint "\n指定基准点: "))
  34.    (setq B (getreal "\n指定旋转角度: "))
  35.    (MATRIX_T E C B 'M_MX_BLKZ)
  36.    (princ)
  37. );;先平移基准点再旋转物件
  38. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  39. ;; M_MX_BLK Creates matrix to multiple local point list by to obtain
  40. ;; a world coordinate point. Used when transforming coordinates inside
  41. ;; a block definition or similar structure.
  42. ;;
  43. ;; MATRIX is always 4x4
  44. ;;     IP   base point of block insertion [translation point]
  45. ;;     SX..SZ   scaling factors along the X,Y,Z axes.
  46. ;;     RT   rotation about Z axis in radians.
  47. ;;
  48. (defun M_MX_BLKZ (IP SX SY SZ RT)
  49.    (list
  50.        (list (* SX (cos RT)) (* SY -1.0 (sin RT)) 0.0 (car IP))
  51.        (list (* SX (sin RT)) (* SY (cos RT)) 0.0 (cadr IP))
  52.        (list 0.0 0.0 SZ (caddr IP))
  53.        (list 0.0 0.0 0.0 1.0)
  54.    )
  55. );;----------------------------------------------------------------------
  56. (defun MATRIX_T  (E PT AA M_MX_BLK / MATRIX)
  57.    (setq  MATRIX '((1.0 0.0 0.0 0.0)
  58.      (0.0 1.0 0.0 0.0)
  59.      (0.0 0.0 1.0 0.0)
  60.      (0.0 0.0 0.0 1.0)
  61.     )
  62.    )
  63.    (vla-transformby
  64.        (vlax-ename->vla-object E)
  65.        (vlax-tmatrix
  66.            (EA:MATRIX_SETTRANSLATION
  67.   MATRIX
  68.   (mapcar '- '(0 0 0) PT)
  69.            )
  70.        )
  71.    )
  72.    (vla-transformby
  73.        (vlax-ename->vla-object E)
  74.        (vlax-tmatrix ((eval M_MX_BLK) '(0 0 0) 1 1 1 (DTOR AA)))
  75.    )
  76.    (vla-transformby
  77.        (vlax-ename->vla-object E)
  78.        (vlax-tmatrix
  79.            (EA:MATRIX_SETTRANSLATION
  80.   MATRIX
  81.   PT
  82.            )
  83.        )
  84.    )
  85. );;----------------------------------------------------------------------
  86. ;;矩阵平移一个向量
  87. (defun EA:MATRIX_SETTRANSLATION  (MATRIX VE / M1 M2 M3)
  88.    (setq  M1 (car MATRIX)
  89.   M2 (cadr MATRIX)
  90.   M3 (nth 2 MATRIX)
  91.    )
  92.    (list  (list (car M1) (cadr M1) (nth 2 M1) (car VE))
  93.   (list (car M2) (cadr M2) (nth 2 M2) (cadr VE))
  94.   (list (car M3) (cadr M3) (nth 2 M3) (last VE))
  95.   '(0.0 0.0 0.0 1.0)
  96.    )
  97. )(defun DTOR (VAL)
  98.    (* VAL (/ pi 180))
  99. )

本帖子中包含更多资源

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

x
发表于 2005-2-3 19:15:00 | 显示全部楼层
[Power=1]
  1. (defun ea:ZeroSmallNum (num)
  2.    (setq num (rtos num 2 24))
  3.    (distof
  4.        (if       (or (wcmatch num "*e-*")
  5.               (wcmatch num "*E-*")
  6.        )
  7.            "0.0"
  8.            num
  9.        )
  10.    )
  11. )
  12. ;;a 绕 x 轴旋转角, yb 绕 y 轴旋转角,zc 绕 z 轴旋转角
  13. ;;返回值 单位矩阵
  14. (defun ea:Matrix_xyz (xa yb zc)
  15.    (mapcar
  16.        '(lambda (x) (mapcar '(lambda (a) (ea:zerosmallnum a)) x))
  17.        (list
  18.            (list (* (cos yb) (cos zc))
  19.               (- (cos yb) (sin zc))
  20.               (- (sin yb))
  21.               0.
  22.            )
  23.            (list (- (* (sin xa) (sin yb) (sin zc)) (* (cos xa) (sin zc)))
  24.               (- (* (cos xa) (cos zc)) (* (sin xa) (sin yb) (sin zc)))
  25.               (* (sin xa) (cos yb))
  26.               0.
  27.            )
  28.            (list (+ (* (cos xa) (sin yb) (sin zc)) (* (sin xa) (sin yb)))
  29.               (- (- (* (cos xa) (sin yb) (sin zc))) (* (sin xa) (cos yb)))
  30.               (* (cos xa) (cos yb))
  31.               0.
  32.            )
  33.            '(0. 0. 0. 1.)
  34.        )
  35.    )
  36. )
[/Power]
发表于 2005-2-4 11:37:00 | 显示全部楼层
两位高手的程序真实巧妙阿。
发表于 2005-2-4 12:27:00 | 显示全部楼层
EA兄:再提供个使用例好吗? (defun C:ROT ()
(setq E (car (entsel)))
(setq C1 (getpoint "\n指定基准点: "))
(setq X (DTOR (getreal "\n指定X旋转角度: ")))
(setq Y (DTOR (getreal "\n指定Y旋转角度: ")))
(setq Z (DTOR (getreal "\n指定Z旋转角度: ")))
(setq MAT (EA:MATRIX_XYZ X Y Z))
;;不会用!! 8-(
;|
(vla-transformby
(vlax-ename->vla-object E)
(vlax-tmatrix
MAT
)
)|;
(princ)
) (defun DTOR (VAL)
(* VAL (/ pi 180))
)
发表于 2005-2-4 12:37:00 | 显示全部楼层
龙龙仔发表于2005-2-4 12:27:00EA兄:再提供个使用例好吗? (defun C:ROT () (setq E (car (entsel))) (setq C1 (getpoint \"\n指定基准点: \")) (setq X (DTOR (getreal \"\n指定...
我很少有3D方面的应用,还得好好想想:)最好你有什么3D变换应用提供个例子(不要太复杂呀),结合起来写更好理解和应用。
另外如果使用矩阵应该还需要其他几个函数配合。这个矩阵是变换点的,不用作用到实体,CAD中不能使用非统一比例矩阵缩放变换。
 楼主| 发表于 2005-2-19 17:04:00 | 显示全部楼层
我的意图是想计算一排点转后的数据, 不是旋转对象用啊. 上面的程序我看的一头雾水. (SETQ M-POINT '((-0.5 -3.0 0.0) (2.19866 7.16542 0.0) (4.74952 17.6138 0.0) (5.95614 27.1406 0.0)
(5.77003 38.9947 0.0) (4.05484 49.3571 0.0) (-0.997759 67.4402 0.0)
(-5.78818 80.7516 0.0) (-8.85785 88.7957 0.0) (-13.0177 98.7803 0.0) (-20.5174 113.578 0.0))) 如这排点我想绕X轴转30度后变成的点 或 绕y轴转 或绕z轴转 其实绕z轴转就用polar涵数计算就好的. 难就是在X 轴和Y轴 我想不通, 高手给我讲解下哦. 谢谢!!!
发表于 2005-2-19 17:49:00 | 显示全部楼层

用UCS吧,

试一下这段程序:
(defun C:recC (/ pl L W ang p2)
(command "UCS" "w")
(setq pl (getpoint "\n Base point:")
L (getdist "\n Length:")
W (getdist pl "\n Width:")
ang (getangle pl "\n Angle:")
)
(command "UCS" "o" pl "ucs" "z" (* 180.0 (/ ang pi))) ;将用户坐标系统旋转ang角;
(command "PLINE" "0,0"
(list L 0)
(list L W)
(list 0 W)
"C")
(command "UCS" "w")
) 再试试这段程序:
(defun C:recC (/ pl L W ang p2)
(command "UCS" "w") (command "ucs" "x" (* 180.0 (/ 30 pi))) ;将用户坐标系统旋转ang角;
(command "point" (list 10 10)) ;点'(10 10 0)
(command "UCS" "w")
)
看看画出的点的坐标是多少,是否能满足你的需要?
发表于 2005-2-20 09:29:00 | 显示全部楼层

回复8楼

8楼,程序我一下写不来,可以提供你经过三维旋转后点坐标的计算方法,你编程序应该是高手。


        绕x轴的旋转a角度的变换矩阵为:


                                                 1                                                                                         0                                                                                 0                                                                          0


                                                 0                                                                                 cos a                 sin a                                                  0


                                                 0                                                                                 -sin a                                 cos        a                                 0


                                                 0                                                                                                 0                                                                         0                                                                                 1


绕y轴的旋转a角度的变换矩阵为:


                                                 cos a                                                                                         0                                                                                 -sin a                                                                                 0


                                                 0                                                                                                                                                        1                                                                                         0                                                                                                                 0       


                                                 sin a                                                                                 0                                                                                                 cos        a                                                          0


                                                 0                                                                                                                          0                                                                                                                          0                                                                                          1


绕z轴的旋转a角度的变换矩阵为:


                                                cos a                 sin a                                                                 0                                                                          0


                                                -sin a                                 cos        a                                  0                                                                                        0


                                                         0                                                                                  0                                                                  1                                                                                 0


                                                  0                                                                                         0                                                                         0                                                                                 1


然后,只需要用原坐标的n+1维向量,与上述变换矩阵相乘,就可以得到所需。
发表于 2005-2-20 09:32:00 | 显示全部楼层
奔想回复7楼,写成了8楼,对不起。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-29 18:25 , Processed in 0.197288 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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