注册 登录
明经CAD社区 返回首页

wowan1314的个人空间 http://www.mjtd.com/?282351 [收藏] [复制] [分享] [RSS]

日志

矩阵相关的一点点!

热度 11已有 3857 次阅读2013-5-6 00:10 |系统分类:应用| 矩阵, 学习, 表达式

一、矩阵
   1.矩阵与向量的学习是很有必要从原理公式根源上来学习的, 不然你无法理解其转换及运行原理
      不了解透彻也就不能随心所欲的利用及构建。
   2.高飞鸟已分享很多lisp中矩阵向量的函数,可作参考。还是要自己根据公式再写一遍。
      有空再说!

====以下为摘抄。
所谓齐次坐标就是将一个原本是n维的向量用一个n+1维向量来表示。例如,二维点(x,y)的齐次坐标表示为(hx,hy,h)。由此可以看出,一个向量的齐次表示是不唯一的,齐次坐标的h取不同的值都表示的是同一个点,比如齐次坐标(8,4,2)、(4,2,1)表示的都是二维点(4,2)。
那么引进齐次坐标有什么必要,它有什么优点呢?
许多图形应用涉及到几何变换,主要包括平移、旋转、缩放。以矩阵表达式来计算这些变换时,平移是矩阵相加,旋转和缩放则是矩阵相乘,综合起来可以表示为p' = p *m1+ m2(m1旋转缩放矩阵, m2为平移矩阵, p为原向量 ,p'为变换后的向量)。引入齐次坐标的目的主要是合并矩阵运算中的乘法和加法,表示为p' = p*M的形式。即它提供了用矩阵运算把二维、三维甚至高维空间中的一个点集从一个坐标系变换到另一个坐标系的有效方法。
其次,它可以表示无穷远的点。n+1维的齐次坐标中如果h=0,实际上就表示了n维空间的一个无穷远点。对于齐次坐标(a,b,h),保持a,b不变,|V|=(x1*x1,y1*y1,z1*z1)^1/2的过程就表示了标准坐标系中的一个点沿直线 ax+by=0 逐渐走向无穷远处的过程。

  所有计算机图形软件)中三维点坐标一般用齐次坐标(X,Y,Z,1)表示,
第四维是为计算方便而增加的,通常值为1。如果是3D向量 第四维为0,以便区分。点在坐标系中就是个特殊的向量.
将其看作一个1X4的矩阵(X指乘号,以下同),与4X4的变换矩阵作矩阵乘,可得到另一个1X4矩阵(x',y',z',h),
将第四维归一化为(x'/h,y'/h,z'/h,1)就是变换后的点坐标

;;;----------------------------------------------------; ;;;功能: 点到直线的距离(带方向) BY 高飞鸟   
               (defun LINE:Perpendicular_Distance_2 (pt p1 p2 / )
(car (trans (mapcar '- pt p1) 0 (mapcar '- p2 p1)))) 
现先看看变换矩阵: 
((a 0 0) (0 b 0) (0 0 1))是比例变换;((1 0 0) (0 1 0) (0 0 s))是等比变换 
((1 0 0) (c 1 0) (0 0 1))是沿x错切变换,((1 b 0) (0 1 0) (0 0 1))是沿Y错切变换 
((cos(a) sin(a) 0) (-sin(a) cos(a) 0) (0 0 1))是旋转变换。 
((1 0 0)(0 1 0)(g h 1))是平移变换 
可以把这个矩阵推广到4X4阶的变换,(包括了透视变换)我不在此赘述。--高飞鸟
 ;;两mapcar是矢量,trans一下变成了位移。还不清楚?还有T加不加都一样?
 ;;如果没第二个mapcar,那么加T与不加就有区别了,区别的作用还不了解
;;矩阵平移与VLA方法及command 方法, command 最慢。 矩阵比VLA快一点点。XD-API的矩阵变换比VLA快很多。
;;但是删除选择集还是command 。
=================================================以下摘自xxsheng的学习心得==
;;矢量就是向量又叫标量还叫位移还叫数量,名字真真多。
;;0向量就是'(0 0 0) 单位向量长度为1.向量的长度用勾股定理算。 其实就是一段线的长度。
;;加法AB+BC=AC,减法反之。还有个平行四边形法则。四点ABCD。AB+AC=AD
;叉乘得到的向量的意义:方向与>a和>b均垂直,
;且使(>a >b (>*> >a >b))成右手系--------
;几何意义:叉乘的模等于以两向量为邻边的平行四边形的面积-
定理  零矢量与共线(共面)的矢量组均共线(共面);
定理  共线矢量必共面;
定理  两矢量必共面;
定理  三矢量中若有两矢量共线,则这三矢量一定共面。-
首先,向量的坐标表示是向量在标架的定义{o e1 e2 e3}的一个表达-----
也就是说,其实,,,,任何对象都是向量?和书上的概念不同?管他呢!
让我们来看一看向量的基础----------------------------------
同一个标架上(O i j k):
假设向量A表达为(1 2 3),向量B表达为(4 5 6),向量C(3 3 3),,,,
则根据向量基本计算法则有:向量AB表达为(3 3 3),那么向量c和AB是什么关系呢???
向量C和向量AB在该标架下的坐标表示是一样的,也就是相等.
而实质是:向量A=矩阵{1 2 3}乘标架矩阵{O i j k}
         向量B=矩阵{4 5 6}乘标架矩阵{O i j k}
         向量C=矩阵{3 3 3}乘标架矩阵{O i j k}
         向量AB=矩阵{3 3 3}乘标架矩阵{向量A i j k}
从这里应该可以看见,把向量C变换为向量B其实就是向量C乘{向量A i j k}
===============看来不看书矩阵是搞不明白了。 
以下是个人的理解,也许还不正确============仅供个人理解
1、向量是个有向线段。 如何表示向量? 
    在CAD中是用坐标来表示向量,那么坐标其实就是向量。
2、一个向量怎么就能用坐标表示呢? 
    平面直角坐标系,i为X方向单位向量,j为Y方向单位向量。0为坐标原点。
   在此坐标系做OP线段。向量a=OP. 那么OP=xi+yj。这个X ,Y 就是向量a的坐标表达式=(x . y)
  CAD的三维坐标 也一样。扩展出Z轴即可 那么向量 a=(x y z).
3、这个是世界坐标系的矩阵--((1. 0. 0. 0.) (0. 1. 0. 0.) (0. 0. 1. 0.) (0. 0. 0. 1.))  ;世界坐标系下是单位矩阵
     世界坐标系的原点始终为(0 0 0)。
  那么分开来看就会发现 这是三个单位向量+第四维(无意思一般为1)组成的。
  这三个单位向量分别表示x y z轴方向的单位向量。所有的相对世界坐标系的坐标(或向量)均与此三个单位向量有关。
4、CAD中随便取个UCS矩阵((0.671131 0.741339 0.0 22283.2) (-0.741339 0.671131 0.0 6325.25) (0.0 0.0 1.0 0.0) (0 0 0 1))
     其原点(getvar 'ucsorg)=(22283.2 6325.25 0.0)
   那么就会发现原点在矩阵中定义的位置是在每个元素的最后一位。
   而每个元素前面的三个元素就是各方向的单位向量,
    验证下(0.671131 0.741339 0.0)=ucsxdir根据勾股定理其长度为1.---正确.
   UCS与WCS的矩阵结构 就是 各方向单位向量+原点 再扩展个第四维 就是矩阵的基本构造。
   根据此结构--那么ucsxdir ,ucsydir,ucsorg 三个变量就能构造除Z轴外的 UCS矩阵。Z轴单位向量怎么得到?
  根据向量叉乘,得到的向量的意义:方向与>a和>b均垂直,那么Z轴就是X Y的单位向量的叉乘。应该是两个值呀????
CAD中的坐标系估计都是成右手系的。。。

5、根据以上,一个向量(坐标),肯定是基于一种坐标系才能表示出来的。先有坐标系再有的坐标(向量)。
      坐标系不同其值也不同。但其的模不变。 也就是说向量变换的是其方向而长度不变.
     trans函数就是得到向量在不同的坐标系下的不同表达式。

6、   矩阵的基本元素 0 x y z .  根据向量坐标表示的原理--- 向量A在 坐标系的表示就向量与坐标系四个元素的各种关系。
       到底是什么样的关系呢?


根据GRVECS函数中关于平移矩阵的描述。结合以上矩阵的结构定义。 

以下矩阵表示以 1.0 的比例作统一的比例缩放并作偏移量为 (5.0,5.0,0.0) 的平移。如果将该矩阵作用到上述矢量上,它们将被平移 (5.0,5.0,0.0)。

'((1.0 0.0 0.0 5.0) (0.0 1.0 0.0 5.0) (0.0 0.0 1.0 0.0) (0.0 0.0 0.0 1.0))
我们就可以知道 所谓的平移矩阵 它也是个坐标系矩阵,
只是该坐标系是当前wcs,它的各方向大小不变,仅改变其坐标系原点。
那么根据此新的坐标系得到的点坐标就相当于在原wcs下进行了平行移动的效果。
但是矩阵中还有表达1的比例的意思,三个1应该是xyz的缩放比例,所以 这个矩阵 不应该这么理解。。????
应该是1表示缩放比例,最后一位是位移量。还有两个0的意思应该是旋转比例的东西
上面的这个平移矩阵是根据坐标x平行于水平线定义的,如果坐标系的x不平行水平线,那又不一样了。
grvecs是个神奇的函数。里面的矩阵用法有点复杂,不适合新手学习。
下一步通过(vla-TransformBy obj (vlax-tmatrix mat))这两个函数进行实体转换来进一步了解矩阵的构造。

点坐标xyz加一位,{X Y Z 1}就是个1X4的矩阵。与4X4的坐标系矩阵进行矩阵乘就是 转换后的点坐标。

似乎明白了点什么,但还不透彻.
归根到底还是要先去了解下 向量与矩阵的运算 定理。不去计算光看文字无法了解其转换的原理。
且哪些原理,公式。往往还有其使用的价值,有时可令复杂的计算简单化。


  1. ;|功能:用户坐标系矩阵的获得---- BY:XXSHENG
  2. (ucsmat)
  3. |;
  4. (defun ucsmat( / x y z o)
  5.   (setq x(getvar 'ucsxdir)
  6.     y(getvar 'ucsydir)
  7.     z(>*> x y)
  8.     o(getvar 'ucsorg))
  9.   (list (list (car x)(cadr x)(caddr x)(car o))
  10.     (list (car y)(cadr y)(caddr y)(cadr o))
  11.     (list (car z)(cadr z)(caddr z)(caddr o))
  12.     '(0 0 0 1))
  13. )

    ;;;UCS到WCS的变换矩阵及其WCS到UCS的变换矩阵   BY;高飞鸟                          
    ;;;the transformation matrix of UCS to WCS and WCS to UCS.              
    (defun UCS2WCS (/ xdir ydir zdir UcsOrg WcsOrg matlst revlst matrix)
      (defun AppendMatrix (lst org)
        (append
          (mapcar 'append lst (mapcar 'list org))
          '((0. 0. 0. 1.))
        )
      )
      (if (zerop (getvar "WORLDUCS"))                    ;如果不同于WCS 
        (setq xdir   (getvar "UCSXDIR")                     ;X方向 
                 ydir   (getvar "UCSYDIR")                     ;Y方向 
                 zdir   (G:CrossProductor xdir ydir)         ;Z方向等于X方向叉乘Y方向 
                 UcsOrg (getvar "UCSORG")                  ;UCS原点 
                 WcsOrg (trans '(0 0 0) 0 1)                   ;WCS原点相对于UCS的坐标 
                 matLst (list xdir ydir zdir)                        ;UCS的旋转矩阵 
                 RevLst (trp matLst)                               ;UCS的旋转矩阵的逆 
                 matrix (list
                          (AppendMatrix matlst WcsOrg)        ;UCS到WCS的变换矩阵
                          (AppendMatrix RevLst UcsOrg)        ;WCS到UCS的变换矩阵
                        )
        )
        (list
          '((1. 0. 0. 0.) (0. 1. 0. 0.) (0. 0. 1. 0.) (0. 0. 0. 1.))  ;世界坐标系下是单位矩阵
          '((1. 0. 0. 0.) (0. 1. 0. 0.) (0. 0. 1. 0.) (0. 0. 0. 1.))  ;世界坐标系下是单位矩阵
        )
      )
    )

    ;;; 矢量的点积                                                          
    ;;; VXV Returns the dot product of 2 vectors                            
    (defun vxv (v1 v2)
      (apply '+ (mapcar '* v1 v2))
    )
    ;;; 矢量转置                                                            
    ;;; TRP Transpose a matrix -Doug Wilson-                                
    (defun trp (m)
      (apply 'mapcar (cons 'list m))
    )
    ;;; 矢量的矩阵变换                                                      
    ;;; MXV Apply a transformation matrix to a vector -Vladimir Nesterovsky-
    (defun mxv (m v)
      (mapcar (function (lambda (r) (vxv r v))) m)
    )
    ;;; 矩阵相乘                                                            
    ;;; MXM Multiply two matrices -Vladimir Nesterovsky-                    
    (defun mxm (m q)
      (mapcar (function (lambda (r) (mxv (trp q) r))) m)
    )
    ;;;两矢量的叉积                                                         
    ;;; CrossProductor --vec1 * vec2                                        
    (defun G:CrossProductor (vec1 vec2 / a b c d e f)                 
      (setq a (car   vec1))
      (setq b (cadr  vec1))
      (setq c (caddr vec1))
      (setq d (car   vec2))
      (setq e (cadr  vec2))
      (setq f (caddr vec2))
      (list
        (- (* b f) (* c e))
        (- (* c d) (* a f))
        (- (* a e) (* b d))
      )
    )
    (defun c:t11(/ ent obj mat)
      (if (setq ent (car (entsel)))
        (progn
          (setq obj (vlax-ename->vla-object ent))
          (setq mat (ucs2wcs))
          (vla-TransformBy obj (vlax-tmatrix (car  mat)))                   ;UCS->WCS
          (command ".select" ent pause)
          (vla-TransformBy obj (vlax-tmatrix (cadr mat)))                  ;WCS->UCS
        )
      )
    )



路过

雷人
8

握手
2

鲜花

鸡蛋

刚表态过的朋友 (10 人)

发表评论 评论 (1 个评论)

回复 caiqs 2019-12-18 22:35
兄弟你研究的好啊,矩阵和向量高中学过的,与数学联系紧密

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

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

GMT+8, 2024-4-23 23:37 , Processed in 0.758375 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部