明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 40992|回复: 87

[【高飞鸟】] 【越飞越高讲堂15】用LISP论矩阵

    [复制链接]
发表于 2013-1-4 19:30 | 显示全部楼层 |阅读模式
本帖最后由 highflybir 于 2013-1-9 12:51 编辑

用LISP论矩阵

矩阵的LISP程序,国内讨论的比较少, 而国外的研究比较深入。
经过长时间的收藏和探索,我综合成了这篇帖子。
这个帖子里面的函数主要是跟CAD 相关。附件包含了本帖完整的lisp代码,还有测试样例。
是一个比较完整的矩阵库。
另外,本帖附上了一些矩阵相关链接。
错误和纰漏之处请大家多多指教。

样例及演示可以参考12楼,另外附件中也有样例。

一、向量的运算
向量,矩阵是息息相关的。这里列出了向量的一些基本运算。
  1. ;;;-----------------------------------------------------------;;
  2. ;;; 两向量相加 addition                                       ;;
  3. ;;; Input: v1,v2 -vectors in R^n                              ;;
  4. ;;; OutPut: A vector                                          ;;
  5. ;;;-----------------------------------------------------------;;
  6. (defun MAT:v+v (v1 v2)
  7.   (mapcar '+ v1 v2)
  8. )

  9. ;;;-----------------------------------------------------------;;
  10. ;;; 两向量相减  subtraction                                   ;;
  11. ;;; Input: v1,v2 -vectors in R^n                              ;;
  12. ;;; OutPut: A vector                                          ;;
  13. ;;;-----------------------------------------------------------;;
  14. (defun MAT:v-v (v1 v2)
  15.   (mapcar '- v1 v2)
  16. )

  17. ;;;-----------------------------------------------------------;;
  18. ;;; 两向量相乘  multiplication                                ;;
  19. ;;; Input: v1,v2 -vectors in R^n                              ;;
  20. ;;; OutPut: A vector                                          ;;
  21. ;;;-----------------------------------------------------------;;
  22. (defun MAT:v*v (v1 v2)
  23.   (mapcar '* v1 v2)
  24. )

  25. ;;;-----------------------------------------------------------;;
  26. ;;; 两向量相除  division                                      ;;
  27. ;;; Input: v1,v2 -vectors in R^n                              ;;
  28. ;;; OutPut: A vector                                          ;;
  29. ;;;-----------------------------------------------------------;;
  30. (defun MAT:v/v (v1 v2)
  31.   (mapcar '/ v1 v2)
  32. )

  33. ;;;-----------------------------------------------------------;;
  34. ;;; 向量乘标量(系数)                                              ;;
  35. ;;; Vector x Scalar - Lee Mac                                      ;;
  36. ;;; Args: v - vector in R^n, s - real scalar                      ;;
  37. ;;;-----------------------------------------------------------;;
  38. (defun MAT:vxs ( v s )
  39.   (mapcar (function (lambda ( n ) (* n s))) v)
  40. )

  41. ;;;-----------------------------------------------------------;;
  42. ;;; 两向量的点积                                              ;;
  43. ;;; Vector Dot Product                                        ;;
  44. ;;; Input: v1,v2 -vectors in R^n                              ;;
  45. ;;;-----------------------------------------------------------;;
  46. (defun MAT:Dot (v1 v2)
  47.   (apply '+ (mapcar '* v1 v2))
  48. )

  49. ;;;-----------------------------------------------------------;;
  50. ;;; 两向量的叉积                                              ;;
  51. ;;; Vector Cross Product                                       ;;
  52. ;;; Args: u,v - vectors in R^3                                      ;;
  53. ;;;-----------------------------------------------------------;;
  54. (defun MAT:vxv ( u v )
  55.   (list
  56.     (- (* (cadr u) (caddr v)) (* (cadr v) (caddr u)))
  57.     (- (* (car  v) (caddr u)) (* (car  u) (caddr v)))
  58.     (- (* (car  u) (cadr  v)) (* (car  v) (cadr  u)))
  59.   )
  60. )

  61. ;;;-----------------------------------------------------------;;
  62. ;;; 线性组合  标量组乘向量组                                  ;;
  63. ;;; Linear combination - highflybird                          ;;
  64. ;;; Input: Vectors - vectors, Scalars, - a real number list   ;;
  65. ;;; Output: a vector                                          ;;
  66. ;;;-----------------------------------------------------------;;
  67. (defun MAT:SxVs (Vectors Scalars)
  68.   (apply 'mapcar (cons '+ (mapcar 'MAT:vxs Vectors Scalars)))
  69. )

  70. ;;;-----------------------------------------------------------;;
  71. ;;; 向量的模(长度)                                              ;;
  72. ;;; Vector Norm - Lee Mac                                             ;;
  73. ;;; Args: v - vector in R^n                                      ;;
  74. ;;;-----------------------------------------------------------;;
  75. (defun MAT:norm ( v )
  76.   (sqrt (apply '+ (mapcar '* v v)))
  77. )

  78. ;;;-----------------------------------------------------------;;
  79. ;;; 向量的模(长度)                                              ;;
  80. ;;; Vector Norm - highflybird                                      ;;
  81. ;;; Args: v - vector in R^3                                      ;;
  82. ;;;-----------------------------------------------------------;;
  83. (defun MAT:Norm3D ( v )
  84.   (distance '(0 0 0) v)
  85. )

  86. ;;;-----------------------------------------------------------;;
  87. ;;; 单位向量                                                      ;;
  88. ;;; Unit Vector - Lee Mac                                     ;;
  89. ;;; Args: v - vector in R^n                                      ;;
  90. ;;;-----------------------------------------------------------;;
  91. (defun MAT:Unitization (v)
  92.   ( (lambda (n)
  93.       (if (equal 0.0 n 1e-14)
  94.         nil
  95.         (MAT:vxs v (/ 1.0 n))
  96.       )
  97.     )
  98.     (MAT:norm v)
  99.   )
  100. )

  101. ;;;-----------------------------------------------------------;;
  102. ;;; 单位向量                                                      ;;
  103. ;;; Unit Vector - highflybird                                 ;;
  104. ;;; Args: v - vector in R^3                                      ;;
  105. ;;;-----------------------------------------------------------;;
  106. (defun MAT:unit ( v / l)
  107.   (cond
  108.     ( (= (setq l (MAT:Norm3D v)) 1.0 ) v)
  109.     ( (> l 1e-14) (MAT:vxs v (/ 1.0 l)))
  110.   )
  111. )

  112. ;;;-----------------------------------------------------------;;
  113. ;;; 两个2d向量的叉积的数值                                    ;;
  114. ;;; 输入: 两个点(或者两个向量)                              ;;
  115. ;;; 输出: 一个数值.如果为正则是逆时针,两向量形成的平面法线向量;;
  116. ;;;       向上,为负则是顺时针,为零则两向量共线或平行。      ;;
  117. ;;;       这个数值也为原点,P1,P2三点面积的两倍。              ;;
  118. ;;;-----------------------------------------------------------;;
  119. (defun MAT:Det2V (v1 v2)
  120.   (- (* (car v1) (cadr v2)) (* (car v2) (cadr v1)))
  121. )

二、向量的旋转
  1. ;;;-----------------------------------------------------------;;
  2. ;;; 旋转一个向量或者点90度                                    ;;
  3. ;;; 输入: 一个向量                                            ;;
  4. ;;; 输出: 被旋转90度后的向量                                  ;;
  5. ;;;-----------------------------------------------------------;;
  6. (defun MAT:Rot90 (vec)
  7.   (vl-list* (- (cadr vec)) (car vec) (cddr vec))
  8. )

  9. ;;;-----------------------------------------------------------;;
  10. ;;; 旋转向量到指定角度                                        ;;
  11. ;;; 输入: 一个向量和指定的角度                                ;;
  12. ;;; 输出: 被旋转后的向量                                      ;;
  13. ;;;-----------------------------------------------------------;;
  14. (defun MAT:Rot2D (v a / c s x y)
  15.   (setq c (cos a) s (sin a))
  16.   (setq x (car v) y (cadr v))
  17.   (list (- (* x c) (* y s)) (+ (* x s) (* y c)))
  18. )

三、 行列式
这里只讨论二阶和三阶的行列式
  1. ;;;-----------------------------------------------------------;;
  2. ;;; 2d行列式 determinant in R^2                               ;;
  3. ;;; Args: 4 numbers                                                  ;;
  4. ;;;-----------------------------------------------------------;;
  5. (defun MAT:Det2 (x1 y1 x2 y2)
  6.   (- (* x1 y2) (* x2 y1))
  7. )

  8. ;;;-----------------------------------------------------------;;
  9. ;;; 3d行列式  determinant in R^3                              ;;
  10. ;;; Args: 9 numbers                                                  ;;
  11. ;;;-----------------------------------------------------------;;
  12. (defun MAT:Det3 (a1 b1 c1 a2 b2 c2 a3 b3 c3)
  13.   (+ (* a1 (- (* b2 c3) (* b3 c2)))
  14.      (* a2 (- (* b3 c1) (* b1 c3)))
  15.      (* a3 (- (* b1 c2) (* b2 c1)))
  16.   )
  17. )

四、 矩阵的基本运算
  1. ;;;-----------------------------------------------------------;;
  2. ;;; 矩阵转置                                                  ;;
  3. ;;; MAT:trp Transpose a matrix -Doug Wilson-                  ;;
  4. ;;; 输入:矩阵                                                ;;
  5. ;;; 输出:转置后的矩阵                                        ;;
  6. ;;;-----------------------------------------------------------;;
  7. (defun MAT:trp (m)
  8.   (apply 'mapcar (cons 'list m))
  9. )

  10. ;;;-----------------------------------------------------------;;
  11. ;;; 矩阵相加                                                  ;;
  12. ;;; Matrix + Matrix - Lee Mac                                 ;;
  13. ;;; Args: m,n - nxn matrices                                  ;;
  14. ;;;-----------------------------------------------------------;;
  15. (defun MAT:m+m ( m n )
  16.   (mapcar '(lambda ( r s ) (mapcar '+ r s)) m n)
  17. )

  18. ;;;-----------------------------------------------------------;;
  19. ;;; 矩阵相减                                                  ;;
  20. ;;; Matrix - Matrix - Lee Mac                                 ;;
  21. ;;; Args: m,n - nxn matrices                                  ;;
  22. ;;;-----------------------------------------------------------;;
  23. (defun MAT:m-m ( m n )
  24.   (mapcar '(lambda ( r s ) (mapcar '- r s)) m n)
  25. )

  26. ;;;-----------------------------------------------------------;;
  27. ;;; 矩阵相乘                                                  ;;
  28. ;;; MAT:mxm Multiply two matrices -Vladimir Nesterovsky-      ;;
  29. ;;;-----------------------------------------------------------;;
  30. (defun MAT:mxm (m q)
  31.   (mapcar (function (lambda (r) (MAT:mxv (MAT:trp q) r))) m)
  32. )

  33. ;;;-----------------------------------------------------------;;
  34. ;;; 矩阵乘标量                                                ;;
  35. ;;; Matrix x Scalar - Lee Mac                                 ;;
  36. ;;; Args: m - nxn matrix, n - real scalar                     ;;
  37. ;;;-----------------------------------------------------------;;
  38. (defun MAT:mxs ( m s )
  39.   (mapcar (function (lambda ( v )(MAT:VxS v s))) m)
  40. )

五、 矩阵与向量的运算
  1. ;;;-----------------------------------------------------------;;
  2. ;;; 向量或点的矩阵变换(向量乘矩阵)                            ;;
  3. ;;; Matrix x Vector - Vladimir Nesterovsky                    ;;
  4. ;;; Args: m - nxn matrix, v - vector in R^n                   ;;
  5. ;;;-----------------------------------------------------------;;
  6. (defun MAT:mxv (m v)
  7.   (mapcar (function (lambda (r) (apply '+ (mapcar '* r v)))) m)
  8. )

  9. ;;;-----------------------------------------------------------;;
  10. ;;; 点的矩阵(4x4 matrix) 变换                                 ;;
  11. ;;; 输入:矩阵m和一个三维点p                                  ;;
  12. ;;; 输出:点变换后的位置                                      ;;
  13. ;;;-----------------------------------------------------------;;
  14. (defun MAT:mxp (m p)
  15.   (reverse (cdr (reverse (MAT:mxv m (append p '(1.0))))))
  16. )

六、矩阵的平面和空间变换
以下是一些矩阵变换的函数。

平移变换
  1. ;;;-----------------------------------------------------------;;
  2. ;;; 平移变换矩阵方式1                                              ;;
  3. ;;; 参数:                                                      ;;
  4. ;;; v - 位移矢量                                              ;;
  5. ;;;-----------------------------------------------------------;;
  6. ;;;---------------=={ Translate by Matrix }==-----------------;;
  7. ;;;                                                           ;;
  8. ;;; Translation Matrix                                        ;;
  9. ;;;-----------------------------------------------------------;;
  10. ;;; Author: highflybird, Copyright ? 2012                     ;;
  11. ;;;-----------------------------------------------------------;;
  12. ;;; Arguments:                                                ;;
  13. ;;; v  - Displacement vector by which to translate            ;;
  14. ;;;-----------------------------------------------------------;;
  15. (defun MAT:Translation ( v )
  16.   (list
  17.     (list 1. 0. 0. (car v))
  18.     (list 0. 1. 0. (cadr v))
  19.     (list 0. 0. 1. (caddr v))
  20.     (list 0. 0. 0. 1.)
  21.   )
  22. )


等比缩放变换
  1. ;;;-----------------------------------------------------------;;
  2. ;;; 比例缩放矩阵                                              ;;
  3. ;;; 参数:                                                      ;;
  4. ;;; Cen   - 基点                                              ;;
  5. ;;; scale - 缩放比例                                          ;;
  6. ;;;-----------------------------------------------------------;;
  7. ;;;-----------------=={ Scale by Matrix }==-------------------;;
  8. ;;;                                                           ;;
  9. ;;; Scaling Matrix                                            ;;
  10. ;;;-----------------------------------------------------------;;
  11. ;;; Author: highflybird, Copyright ? 2012                     ;;
  12. ;;;-----------------------------------------------------------;;
  13. ;;; Arguments:                                                ;;
  14. ;;; Cen    - Base Point for Scaling Transformation            ;;
  15. ;;; scale  - Scale Factor by which to scale object            ;;
  16. ;;;-----------------------------------------------------------;;
  17. (defun MAT:Scaling ( Cen scale / s)
  18.   (setq s (- 1 scale))
  19.   (list
  20.     (list scale 0. 0. (* s (car Cen)))
  21.     (list 0. scale 0. (* s (cadr Cen)))
  22.     (list 0. 0. scale (* s (caddr Cen)))
  23.     '(0. 0. 0. 1.)
  24.   )
  25. )


二维旋转变换
  1. ;;;-----------------------------------------------------------;;
  2. ;;; 二维旋转变换矩阵                                              ;;
  3. ;;; 参数:                                                      ;;
  4. ;;; Cen - 基点                                                ;;
  5. ;;; ang - 旋转角度                                            ;;
  6. ;;;-----------------------------------------------------------;;
  7. ;;;-----------------=={ Rotate by Matrix }==------------------;;
  8. ;;;                                                           ;;
  9. ;;; Rotation Matrix                                           ;;
  10. ;;;-----------------------------------------------------------;;
  11. ;;; Author: highflybird, Copyright ? 2012                     ;;
  12. ;;;-----------------------------------------------------------;;
  13. ;;; Arguments:                                                ;;
  14. ;;; Cen    - Base Point for Rotation Transformation           ;;
  15. ;;; ang    - Angle through which to rotate object             ;;
  16. ;;;-----------------------------------------------------------;;
  17. (defun MAT:Rotation ( Cen ang / c s x y)
  18.   (setq c (cos ang) s (sin ang))
  19.   (setq x (car Cen) y (cadr Cen))
  20.   (list
  21.     (list c (- s) 0. (- x (- (* c x) (* s y))))
  22.     (list s    c  0. (- y (+ (* s x) (* c y))))
  23.     '(0. 0. 1. 0.)
  24.     '(0. 0. 0. 1.)
  25.   )
  26. )


三维旋转变换
  1. ;;;-----------------------------------------------------------;;
  2. ;;; 三维旋转变换矩阵                                              ;;
  3. ;;; 参数:                                                      ;;
  4. ;;; Cen  - 基点                                               ;;
  5. ;;; Axis - 旋转轴                                             ;;
  6. ;;; ang  - 旋转角                                             ;;
  7. ;;;-----------------------------------------------------------;;
  8. ;;;---------------=={ 3D Rotate by Matrix }==-----------------;;
  9. ;;; Author: highflybird.                                      ;;
  10. ;;; Arguments:                                                ;;
  11. ;;; Cen ---Input origin point of rotation                      ;;
  12. ;;; Axis---Input axis vector of rotation                       ;;
  13. ;;; Ang ---Input angle of rotation                              ;;
  14. ;;;-----------------------------------------------------------;;
  15. (defun MAT:Rotation3D (Cen Axis Ang / A B C D M N P x y z)
  16.   (setq D (distance '(0 0 0) Axis))
  17.   (if (or (< D 1e-8) (zerop ang))
  18.     '((1. 0. 0. 0.) (0. 1. 0. 0.) (0. 0. 1. 0.) (0. 0. 0. 1.))
  19.     (setq N (mapcar '/ Axis (list D D D))
  20.           x (car N)
  21.           y (cadr N)
  22.           z (caddr N)
  23.           A (cos Ang)
  24.           B (sin Ang)
  25.           C (- 1 A)
  26.           M (list (list (+ A (* x x C))
  27.                         (- (* x y C) (* z B))
  28.                         (+ (* y B) (* x z C))
  29.                   )
  30.                   (list (+ (* z B) (* x y C))
  31.                         (+ A (* y y C))
  32.                         (- (* y z C) (* x B))
  33.                   )
  34.                   (list (- (* x z C) (* y B))
  35.                         (+ (* x B) (* y z C))
  36.                         (+ A (* z z C))
  37.                   )
  38.             )
  39.           p (mapcar '- Cen (Mat:mxv M Cen))
  40.           M (Mat:DispToMatrix M p)
  41.     )
  42.   )
  43. )

二维镜像变换
  1. ;;;-----------------------------------------------------------;;
  2. ;;; 二维镜像变换矩阵                                              ;;
  3. ;;; 参数:                                                      ;;
  4. ;;; p1     - 镜像向量第一点                                   ;;
  5. ;;; p2     - 镜像向量第二点                                   ;;
  6. ;;;-----------------------------------------------------------;;
  7. ;;;----------------=={ Reflect by Matrix }==------------------;;
  8. ;;;                                                           ;;
  9. ;;; Reflects a VLA-Object or Point List using a               ;;
  10. ;;; Transformation Matrix                                     ;;
  11. ;;;-----------------------------------------------------------;;
  12. ;;; Author: Lee Mac, Copyright ? 2010 - www.lee-mac.com       ;;
  13. ;;;-----------------------------------------------------------;;
  14. ;;; Arguments:                                                ;;
  15. ;;; target - VLA-Object or Point List to transform            ;;
  16. ;;; p1, p2 - Points representing vector in which to reflect   ;;
  17. ;;;-----------------------------------------------------------;;
  18. (defun MAT:Reflect ( p1 p2 / a c s x y)
  19.   (setq a (angle p1 p2) a (+ a a))
  20.   (setq c (cos a) s (sin a))
  21.   (setq x (car p1) y (cadr p1))
  22.   (list
  23.     (list c    s  0. (- x (+ (* c x) (* s y))))
  24.     (list s (- c) 0. (- y (- (* s x) (* c y))))
  25.     '(0. 0. 1. 0.)
  26.     '(0. 0. 0. 1.)
  27.   )
  28. )

三维镜像变换
  1. ;;;-----------------------------------------------------------;;
  2. ;;; 三维镜像变换矩阵                                              ;;
  3. ;;; 参数:                                                      ;;
  4. ;;; p1,p2,p3 - 三点定义的镜像平面                             ;;
  5. ;;;-----------------------------------------------------------;;
  6. ;;;---------------=={ 3D Reflect by Matrix }==----------------;;
  7. ;;;                                                           ;;
  8. ;;; Reflection matrix                                         ;;
  9. ;;;-----------------------------------------------------------;;
  10. ;;; Author: highflybird, Copyright ? 2012-                    ;;
  11. ;;;-----------------------------------------------------------;;
  12. ;;; Arguments:                                                ;;
  13. ;;; p1,p2,p3 - Three 3D points defining the reflection plane  ;;
  14. ;;;-----------------------------------------------------------;;
  15. (defun MAT:Reflect3D (p1 p2 p3 / m ux uy uz)
  16.   (mapcar
  17.     'set
  18.     '(ux uy uz)
  19.     (MAT:unit (MAT:vxv (mapcar '- p2 p1) (mapcar '- p3 p1)))
  20.   )
  21.   (setq        m (list        (list (- 1. (* 2. ux ux)) (* -2. uy ux) (* -2. ux uz))
  22.                 (list (* -2. ux uy) (- 1. (* 2. uy uy)) (* -2. uy uz))
  23.                 (list (* -2. ux uz) (* -2. uy uz) (- 1. (* 2. uz uz)))
  24.           )
  25.   )
  26.   (Mat:DispToMatrix m (mapcar '- p1 (MAT:mxv m p1)))
  27. )


附件中包含Lee-mac的一些算法,与我的大同小异。区别在于,我的矩阵是为大量运算准备,
Lee-mac的为单次次数不多时运用。

七、块参照,属性的变换矩阵和逆矩阵
附件
  1. ;;;-----------------------------------------------------------;;
  2. ;;; 功能: 某点在块内坐标系统和世界或者用户坐标系统的转换     ;;
  3. ;;; 参数: pt 要变换的点。                                    ;;
  4. ;;;        rlst 用 nentselp或者nentsel得到的表的最后一项      ;;
  5. ;;;        from  坐标系:0,WCS; 1,当前UCS; 2,块参照坐标系RCS  ;;
  6. ;;;        to    坐标系:0,WCS; 1,当前UCS; 2,块参照坐标系RCS  ;;
  7. ;;;-----------------------------------------------------------;;
  8. ;;; MAT:TransNested (gile)                                    ;;
  9. ;;; Translates a point coordinates from WCS or UCS to RCS     ;;
  10. ;;; -coordinates system of a                                      ;;
  11. ;;; reference (xref or block) whatever its nested level-      ;;
  12. ;;;                                                              ;;
  13. ;;; Arguments                                                      ;;
  14. ;;; pt : the point to translate                                      ;;
  15. ;;; rlst : the parents entities list from the deepest nested  ;;
  16. ;;;        to the one inserted in current space -same as      ;;
  17. ;;;        (last (nentsel)) or (last (nentselp))              ;;
  18. ;;; from to : as with trans function: 0.WCS, 1.UCS, 2.RCS     ;;
  19. ;;;-----------------------------------------------------------;;

  20. (defun MAT:TransNested (pt rlst from to / GEOM)
  21.   (and (= 1 from) (setq pt (trans pt 1 0)))
  22.   (and (= 2 to) (setq rlst (reverse rlst)))
  23.   (and (or (= 2 from) (= 2 to))
  24.        (while rlst
  25.         (setq geom (if        (= 2 to)
  26.                       (MAT:RevRefGeom (car rlst))
  27.                       (MAT:RefGeom (car rlst))
  28.                     )
  29.                rlst (cdr rlst)
  30.                pt   (mapcar '+ (MAT:mxv (car geom) pt) (cadr geom))
  31.         )
  32.        )
  33.   )
  34.   (if (= 1 to)
  35.     (trans pt 0 1)
  36.     pt
  37.   )
  38. )

  39. ;;;-----------------------------------------------------------;;
  40. ;;; 功能:图块的变换矩阵                                      ;;
  41. ;;; 输入:块参照的图元名                                      ;;
  42. ;;; 输出:块参照的变换矩阵                                    ;;
  43. ;;;-----------------------------------------------------------;;
  44. ;;; MAT:RefGeom (gile)                                              ;;
  45. ;;; Returns a list which first item is a 3x3 transformation   ;;
  46. ;;; matrix(rotation,scales normal) and second item the object ;;
  47. ;;; insertion point in its parent(xref, bloc or space)              ;;
  48. ;;;                                                              ;;
  49. ;;; Argument : an ename                                              ;;
  50. ;;;-----------------------------------------------------------;;

  51. (defun MAT:RefGeom (ename / elst ang norm mat)
  52.   (setq        elst (entget ename)
  53.         ang  (cdr (assoc 50 elst))
  54.         norm (cdr (assoc 210 elst))
  55.   )
  56.   (list
  57.     (setq mat
  58.            (MAT:mxm
  59.              (mapcar (function (lambda (v) (trans v 0 norm T)))
  60.                      '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
  61.              )
  62.              (MAT:mxm
  63.                (list (list (cos ang) (- (sin ang)) 0.0)
  64.                      (list (sin ang) (cos ang) 0.0)
  65.                      '(0.0 0.0 1.0)
  66.                )
  67.                (list (list (cdr (assoc 41 elst)) 0.0 0.0)
  68.                      (list 0.0 (cdr (assoc 42 elst)) 0.0)
  69.                      (list 0.0 0.0 (cdr (assoc 43 elst)))
  70.                )
  71.              )
  72.            )
  73.     )
  74.     (mapcar
  75.       '-
  76.       (trans (cdr (assoc 10 elst)) norm 0)
  77.       (MAT:mxv mat
  78.            (cdr (assoc 10 (tblsearch "BLOCK" (cdr (assoc 2 elst)))))
  79.       )
  80.     )
  81.   )
  82. )

  83. ;;;-----------------------------------------------------------;;
  84. ;;; 功能:图块的变换矩阵的逆矩阵                              ;;
  85. ;;;-----------------------------------------------------------;;
  86. ;;; MAT:RevRefGeom (gile)                                      ;;
  87. ;;; MAT:RefGeom inverse function                              ;;
  88. ;;; 输入:块参照的图元名                                      ;;
  89. ;;; 输出:块参照的变换矩阵的逆矩阵                            ;;
  90. ;;;-----------------------------------------------------------;;
  91. (defun MAT:RevRefGeom (ename / entData ang norm mat)
  92.   (setq        entData        (entget ename)
  93.         ang        (- (cdr (assoc 50 entData)))
  94.         norm        (cdr (assoc 210 entData))
  95.   )
  96.   (list
  97.     (setq mat
  98.            (MAT:mxm
  99.              (list (list (/ 1 (cdr (assoc 41 entData))) 0.0 0.0)
  100.                    (list 0.0 (/ 1 (cdr (assoc 42 entData))) 0.0)
  101.                    (list 0.0 0.0 (/ 1 (cdr (assoc 43 entData))))
  102.              )
  103.              (MAT:mxm
  104.                (list (list (cos ang) (- (sin ang)) 0.0)
  105.                      (list (sin ang) (cos ang) 0.0)
  106.                      '(0.0 0.0 1.0)
  107.                )
  108.                (mapcar (function (lambda (v) (trans v norm 0 T)))
  109.                        '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
  110.                )
  111.              )
  112.            )
  113.     )
  114.     (mapcar '-
  115.             (cdr (assoc 10 (tblsearch "BLOCK" (cdr (assoc 2 entData)))))
  116.             (MAT:mxv mat (trans (cdr (assoc 10 entData)) norm 0))
  117.     )
  118.   )
  119. )

  120. ;;;-----------------------------------------------------------;;
  121. ;;; 属性的变换矩阵Attrib Transformation Matrix.        -highflybird  ;;
  122. ;;; 输入:Ename 属性的图元名                                  ;;
  123. ;;; 输出:属性的变换矩阵                                      ;;
  124. ;;;-----------------------------------------------------------;;
  125. (defun MAT:AttGeom (ename / ang norm mat elst)
  126.   (setq elst (entget ename)
  127.         ang  (cdr (assoc 50 elst))
  128.         norm (cdr (assoc 210 elst))
  129.   )
  130.   (list
  131.     (setq mat
  132.            (mxm
  133.              (mapcar (function (lambda (v) (trans v 0 norm T)))
  134.                      '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
  135.              )
  136.              (list (list (cos ang) (- (sin ang)) 0.0)
  137.                    (list (sin ang) (cos ang) 0.0)
  138.                    '(0.0 0.0 1.0)
  139.              )
  140.            )
  141.     )
  142.     (trans (cdr (assoc 10 elst)) norm 0)
  143.   )
  144. )

八、三点变换矩阵,UCS变换矩阵,图元变换矩阵和通用变换矩阵
  1. ;;;-----------------------------------------------------------;;
  2. ;;; Append displacement vector to a matrix         -Highflybird- ;;
  3. ;;; 把位移矢量添加到矩阵中                                    ;;
  4. ;;; 输入:mat -- 矩阵(3x3),disp -- 位移矢量                  ;;
  5. ;;; 输出:一个4X4的变换CAD的标准变换矩阵                      ;;
  6. ;;;-----------------------------------------------------------;;
  7. (defun Mat:DispToMatrix        (mat disp)
  8.   (append
  9.     (mapcar 'append mat (mapcar 'list disp))
  10.     '((0. 0. 0. 1.))
  11.   )
  12. )

  13. ;;;-----------------------------------------------------------;;
  14. ;;; 从一个坐标系统到另一个坐标系统的变换矩阵                  ;;
  15. ;;; 输入:from - 源坐标系;to - 目的坐标系                    ;;
  16. ;;; 输出:一个4X4的变换CAD的标准变换矩阵                      ;;
  17. ;;;-----------------------------------------------------------;;
  18. (defun MAT:Trans (from to)
  19.   (Mat:DispToMatrix
  20.     (mapcar
  21.       (function (lambda (v) (trans v from to t)))
  22.       '((1. 0. 0.) (0. 1. 0.) (0. 0. 1.))
  23.     )
  24.     (trans '(0 0 0) to from)
  25.   )
  26. )

  27. ;;;-----------------------------------------------------------;;
  28. ;;; wcs到ucs矩阵,也可称UCS的变换矩阵                               ;;
  29. ;;;-----------------------------------------------------------;;
  30. (defun MAT:w2u () (MAT:Trans 0 1))

  31. ;;;-----------------------------------------------------------;;
  32. ;;; ucs到wcs矩阵,也可称UCS的逆变换矩阵                       ;;
  33. ;;;-----------------------------------------------------------;;
  34. (defun MAT:u2w () (MAT:Trans 1 0))

  35. ;;;-----------------------------------------------------------;;
  36. ;;; 通用变换矩阵 by highflybird                                      ;;
  37. ;;; 输入:from - 原坐标系,                                   ;;
  38. ;;;       to   - 目的坐标系,                                 ;;
  39. ;;;       Org  - 目的坐标系的原点相对原坐标系的位置           ;;
  40. ;;;       Ang  - 相对于原坐标系的旋转角度                     ;;
  41. ;;; 输出:两个矩阵,一个是从原坐标系变换到目的坐标系的变换矩阵;;
  42. ;;;       一个是从目的坐标系变换到原坐标系的变换矩阵          ;;
  43. ;;;-----------------------------------------------------------;;
  44. (defun MAT:Trans1 (from to Org Ang / Mat Rot Inv Cen)
  45.   (setq Mat (mapcar (function (lambda (v) (trans v from to T)))
  46.                     '((1. 0. 0.) (0. 1. 0.) (0. 0. 1.))
  47.             )
  48.   )
  49.   (if (not (equal ang 0 1e-14))
  50.     (setq Rot (list (list (cos ang) (- (sin ang)) 0.)
  51.                     (list (sin ang) (cos ang) 0.)
  52.                     (list 0. 0. 1.)
  53.               )
  54.           mat (MAT:mxm mat Rot)
  55.     )
  56.   )
  57.   (setq Cen (trans Org to from))
  58.   (setq Inv (mat:trp mat))
  59.   (list
  60.     (Mat:DispToMatrix Inv (mat:mxv Inv (mapcar '- Cen)))        ;from->to (trans pt from to)
  61.     (Mat:DispToMatrix mat Cen)                                         ;to->from (trans pt to from)
  62.   )
  63. )

  64. ;;;-----------------------------------------------------------;;
  65. ;;; 通过两个坐标轴和坐标原点定义的变换矩阵  -by highflybird   ;;
  66. ;;; 输入:Org  - 坐标系原点,                                 ;;
  67. ;;;       Vx   - 坐标系X 方向,                               ;;
  68. ;;;       Vy   - 坐标系y 方向                                 ;;
  69. ;;; 输出:两个矩阵,一个是该坐标系的变换矩阵,一个是其逆矩阵  ;;
  70. ;;;-----------------------------------------------------------;;
  71. (defun MAT:2VMatrix (Org Vx Vy / Vz Rot)
  72.   (if (or (equal Vx '(0 0 0) 1e-14) (equal Vy '(0 0 0) 1e-14))
  73.     '((1. 0. 0. 0.) (0. 1. 0. 0.) (0. 0. 1. 0.) (0. 0. 0. 1.))
  74.     (progn
  75.       (setq Vx        (Mat:Unit Vx))                                         ;X Axis
  76.       (setq Vy        (Mat:Unit Vy))                                        ;Y Axis
  77.       (setq Vz        (Mat:unit (MAT:vxv Vx Vy)))                         ;Z Axis
  78.       (setq Vy        (Mat:unit (MAT:vxv Vz Vx)))                         ;Y Axis
  79.       (setq Rot (list Vx Vy Vz))                                 ;Rotation matrix
  80.       (list                                                         ;Inverse Rotation matrix
  81.         (Mat:DispToMatrix (MAT:trp Rot) Org)                        ;The transformation matrix from UCS to WCS
  82.         (Mat:DispToMatrix Rot (MAT:mxv Rot (mapcar '- Org)))        ;The transformation matrix from WCS to UCS
  83.       )
  84.     )
  85.   )
  86. )

  87. ;;;-----------------------------------------------------------;;
  88. ;;; Mat:3PMatrix  -Highflybird-                               ;;
  89. ;;; 通过两个坐标轴和坐标原点定义的变换矩阵  -by highflybird   ;;
  90. ;;; 输入:P1 - 坐标系原点,                                   ;;
  91. ;;;       P2 - 坐标系的第2点                                  ;;
  92. ;;;       P3 - 坐标系的第3点                                  ;;
  93. ;;; 输出:两个矩阵,一个是该坐标系的变换矩阵,一个是其逆矩阵  ;;
  94. ;;;-----------------------------------------------------------;;
  95. (defun Mat:3PMatrix (p1 p2 p3 / v1 v2 v3)
  96.   (MAT:2VMatrix P1 (mapcar '- p2 p1) (mapcar '- p3 p1))
  97. )

  98. ;;;-----------------------------------------------------------;;
  99. ;;; 平齐实体的变换矩阵  -by highflybird                              ;;
  100. ;;; 输入:Ent - 实体名                                        ;;
  101. ;;; 输出:平齐这个实体的变换矩阵和它的逆矩阵                  ;;
  102. ;;;-----------------------------------------------------------;;
  103. (defun Mat:EntityMatrix (Ent / z dxf Cen obj an m1 mat Inv org)
  104.   (setq dxf (entget ent))
  105.   (if (setq Cen (cdr (assoc 10 dxf)))                                ;Insertpoint,center or startpoint,etc.
  106.     (if (null (caddr Cen))
  107.       (setq Cen (append Cen '(0.0)))
  108.     )
  109.     (setq Cen '(0 0 0))
  110.   )
  111.   (setq obj (vlax-ename->vla-object Ent))                        
  112.   (if (and (vlax-property-available-p obj 'elevation)                ;If it has elevation value.
  113.            (wcmatch (vla-get-objectname obj) "*Polyline")        ;It's a "AcDb2dPolyline" or "AcDbPolyline" object
  114.       )
  115.     (setq z   (vla-get-elevation obj)
  116.           Cen (list (car Cen) (cadr Cen) (+ (caddr Cen) z))        ;add elevation value
  117.     )
  118.   )
  119.   (if (vlax-property-available-p obj 'rotation)                 ;if it has a rotaion angle
  120.     (setq an (vla-get-rotation obj))
  121.     (setq an 0)
  122.   )
  123.   (MAT:Trans1 0 Ent Cen an)                                         ;return two matrices, the first is WCS->OCS,the second is OCS->WCS
  124. )


九、轴测变换矩阵
  1. ;;;-----------------------------------------------------------;;
  2. ;;;通用的轴测变换矩阵     highflybird  2012.12                ;;
  3. ;;;Axonometric projections Rotation matrices                  ;;
  4. ;;;Isometric projection: a = (/ pi 4),b = (atan (- (sqrt 2))) ;;
  5. ;;;Input: a - Rotation angle about the vertical axis          ;;
  6. ;;;       b - Rotation angle about the horizontal axis        ;;
  7. ;;;Output: transforamtion matrix of this projection           ;;
  8. ;;;-----------------------------------------------------------;;
  9. (defun MAT:ISO (a b / ca sa cb sb)
  10.   (setq ca (cos a))
  11.   (setq sa (sin a))
  12.   (setq cb (cos b))
  13.   (setq sb (sin b))
  14.   (list (list ca        (- sa)    0      0)
  15.         (list (* sa cb) (* ca cb) (- sb) 0)
  16.         (list (* sa sb) (* ca sb) cb     0)
  17.         (list 0 0 0 1)
  18.   )
  19. )
演示:

十、矩阵的特征值和特征向量
chlh_jd讨论比较深入,参见如下链接:
http://bbs.mjtd.com/thread-99908-1-1.html
http://www.theswamp.org/index.php?topic=43453.0
关于上面的几个链接地址的源代码已经录入下面的附件中了。

本帖子中包含更多资源

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

x

点评

楼主的东西真好。不过LM:APPLYMATRIXTRANSFORMATION重复了一个,还有MAT:ATTGEOM中的MXM未定义,是否应该是Mat:MXM呢?  发表于 2015-5-11 19:10
一直畏惧矩阵,这下应该...我不怕不怕了  发表于 2013-1-4 19:56

评分

参与人数 18明经币 +23 金钱 +110 收起 理由
Bao_lai + 1
weilu + 1 很给力!
tigcat + 1 很给力!
wanghangshun + 1 很给力!
kkq0305 + 1 很给力!
songyujie928 + 1 赞一个!
执骨哟 + 1 赞一个!
pzweng + 3 很给力!
vectra + 1
brbright + 1 很给力!

查看全部评分

"觉得好,就打赏"
    共1人打赏

本帖被以下淘专辑推荐:

发表于 2021-12-12 21:06 | 显示全部楼层
高版主,如您有空,可否至http://bbs.mjtd.com/thread-184557-1-1.html稍作指导?是矩阵转换问题,谢谢您。
发表于 2020-8-22 23:14 | 显示全部楼层
  感谢大神分享,学习一下!
发表于 2013-1-4 19:52 | 显示全部楼层
沙发,慢慢看
发表于 2013-1-4 20:13 | 显示全部楼层
这玩意,有难度,看不懂
发表于 2013-1-4 20:18 来自手机 | 显示全部楼层
楼主真乃高人也。
发表于 2013-1-4 20:28 | 显示全部楼层
忘了这么久的线性代数,捡回来不容易,顶顶算了

点评

听说矩阵会玩了,就能玩lsp了,黄兄岂能不试?  发表于 2013-1-4 20:33
发表于 2013-1-4 20:36 | 显示全部楼层
非常好的帖子,楼主强大。
发表于 2013-1-4 22:05 | 显示全部楼层
一定要顶的!
发表于 2013-1-4 22:32 | 显示全部楼层
这个一定要顶起来,,,
发表于 2013-1-4 22:46 | 显示全部楼层
对,一定要顶,高版真乃神人

留个迹在这,日后已便查看学习
发表于 2013-1-4 22:53 来自手机 | 显示全部楼层
好多,有得看学习了.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-27 07:18 , Processed in 0.395852 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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