分享

【飞鸟集】UCS的变换矩阵及其逆变换矩阵

 求真我 2014-03-28
这里提供一个函数,得到当前UCS下的变化矩阵和逆变换矩阵。
普通浏览复制代码
  1. ;;;UCS到WCS的变换矩阵及其WCS到UCS的变换矩阵                             
  2. ;;;the transformation matrix of UCS to WCS and WCS to UCS.              
  3. (defun UCS2WCS (/ xdir ydir zdir UcsOrg WcsOrg matlst revlst matrix)
  4.   (defun AppendMatrix (lst org)
  5.     (append
  6.       (mapcar 'append lst (mapcar 'list org))
  7.       '((0. 0. 0. 1.))
  8.     )
  9.   )
  10.   (if (zerop (getvar "WORLDUCS"))                    ;如果不同于WCS 
  11.     (setq xdir   (getvar "UCSXDIR")                     ;X方向 
  12.              ydir   (getvar "UCSYDIR")                     ;Y方向 
  13.              zdir   (G:CrossProductor xdir ydir)         ;Z方向等于X方向叉乘Y方向 
  14.              UcsOrg (getvar "UCSORG")                  ;UCS原点 
  15.              WcsOrg (trans '(0 0 0) 0 1)                   ;WCS原点相对于UCS的坐标 
  16.              matLst (list xdir ydir zdir)                        ;UCS的旋转矩阵 
  17.              RevLst (trp matLst)                               ;UCS的旋转矩阵的逆 
  18.              matrix (list
  19.                       (AppendMatrix matlst WcsOrg)        ;UCS到WCS的变换矩阵
  20.                       (AppendMatrix RevLst UcsOrg)        ;WCS到UCS的变换矩阵
  21.                     )
  22.     )
  23.     (list
  24.       '((1. 0. 0. 0.) (0. 1. 0. 0.) (0. 0. 1. 0.) (0. 0. 0. 1.))  ;世界坐标系下是单位矩阵
  25.       '((1. 0. 0. 0.) (0. 1. 0. 0.) (0. 0. 1. 0.) (0. 0. 0. 1.))  ;世界坐标系下是单位矩阵
  26.     )
  27.   )
  28. )
  29. ;;; 矢量的点积                                                          
  30. ;;; VXV Returns the dot product of 2 vectors                            
  31. (defun vxv (v1 v2)
  32.   (apply '+ (mapcar '* v1 v2))
  33. )
  34. ;;; 矢量转置                                                            
  35. ;;; TRP Transpose a matrix -Doug Wilson-                                
  36. (defun trp (m)
  37.   (apply 'mapcar (cons 'list m))
  38. )
  39. ;;; 矢量的矩阵变换                                                      
  40. ;;; MXV Apply a transformation matrix to a vector -Vladimir Nesterovsky-
  41. (defun mxv (m v)
  42.   (mapcar (function (lambda (r) (vxv r v))) m)
  43. )
  44. ;;; 矩阵相乘                                                            
  45. ;;; MXM Multiply two matrices -Vladimir Nesterovsky-                    
  46. (defun mxm (m q)
  47.   (mapcar (function (lambda (r) (mxv (trp q) r))) m)
  48. )
  49. ;;;两矢量的叉积                                                         
  50. ;;; CrossProductor --vec1 * vec2                                        
  51. (defun G:CrossProductor (vec1 vec2 / a b c d e f)                 
  52.   (setq a (car   vec1))
  53.   (setq b (cadr  vec1))
  54.   (setq c (caddr vec1))
  55.   (setq d (car   vec2))
  56.   (setq e (cadr  vec2))
  57.   (setq f (caddr vec2))
  58.   (list
  59.     (- (* b f) (* c e))
  60.     (- (* c d) (* a f))
  61.     (- (* a e) (* b d))
  62.   )
  63. )
以下作为测试
普通浏览复制代码
  1.                                                   
  2. (defun c:test(/ ent obj mat)
  3.   (if (setq ent (car (entsel)))
  4.     (progn
  5.       (setq obj (vlax-ename->vla-object ent))
  6.       (setq mat (ucs2wcs))
  7.       (vla-TransformBy obj (vlax-tmatrix (car  mat)))                   ;UCS->WCS
  8.       (command ".select" ent pause)
  9.       (vla-TransformBy obj (vlax-tmatrix (cadr mat)))                  ;WCS->UCS
  10.     )
  11.   )
  12. )

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多