找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1274|回复: 10

[求助] vla-TransformBy所使用的矩阵是如何构成的?

[复制链接]

已领礼包: 604个

财富等级: 财运亨通

发表于 2018-2-17 11:24:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 /db_自贡黄明儒_ 于 2018-2-17 11:25 编辑

或者说vla-TransformBy所使用的矩阵是如何写的?需要储备哪些知道。
如(setq mat        (vlax-tmatrix
                  (list
                    (list 1 0 (car ZA) 0)
                    (list 0 1 (cadr ZA) 0)
                    (list 0 0 (caddr ZA) 0)
                    (list 0 0 0 1)
                    )
                  )
            )
这样的矩阵为什么是四行四列(用线性代数的眼光看)?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 20个

财富等级: 恭喜发财

发表于 2018-2-18 21:17:18 | 显示全部楼层
下面代码可以把nest嵌套的实体用矩阵变换COPY到当前空间
vla-transformby 和 vlax-tmatrix的例子

搜狗截图20180218211728.gif

  1. (defun c:tt (/ doc space ent obj new)
  2.   (setq        doc   (vla-get-activedocument (vlax-get-acad-object))
  3.         space (if (eq (getvar 'CVPORT) 1)
  4.                 (vla-get-paperspace doc)
  5.                 (vla-get-modelspace doc)
  6.               )
  7.   )
  8.   (if (setq ent (nentselp "\nSelect nested object to copy: "))
  9.     (progn (if (eq (cdr (assoc 0 (entget (car ent)))) "VERTEX")
  10.              (setq obj (vlax-ename->vla-object
  11.                          (cdr (assoc 330 (entget (car ent))))
  12.                        )
  13.              )
  14.              (setq obj (vlax-ename->vla-object (car ent)))
  15.            )
  16.            (setq new (car (vlax-invoke doc 'CopyObjects (list obj) space)))
  17.            (vla-transformby new (vlax-tmatrix (caddr ent)))
  18.     )
  19.   )
  20.   (princ)
  21. )


评分

参与人数 1D豆 +5 收起 理由
/db_自贡黄明儒_ + 5 这个很实用。

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 1 反对 0

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2018-2-17 11:54:22 | 显示全部楼层
因为数学上,就是用 4行4列的数 表示矩阵啊。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2018-2-17 13:39:13 | 显示全部楼层
http://www.cnblogs.com/melode11/archive/2009/12/19/1627554.html
基本的2D图形变换&变换矩阵推导

平时开发程序,免不了要对图像做各种变换处理。有的时候变换可能比较复杂,比如平移之后又旋转,旋转之后又平移,又缩放。

直接用公式计算,不但复杂,而且效率低下。这时可以借助变换矩阵和矩阵乘法,将多个变换合成一个。 最后只要用一个矩阵对每个点做一次处理就可以得到想要的结果。

另外,矩阵乘法一般有硬件支持,比如3D 图形加速卡,处理3D变换中的大量矩阵运算,比普通CPU 要快上1000倍。

下面是3类基本的2D图形变换。

平移:

设某点向x方向移动 dx, y方向移动 dy ,[x,y]为变换前坐标, [X,Y]为变换后坐标。

则 X = x+dx;  Y = y+dy;

以矩阵表示:

                              1    0    0

[X, Y, 1] = [x, y, 1][ 0    1    0  ] ;

                              dx  dy   1

  1    0    0

  0    1    0   即平移变换矩阵。

  dx  dy   1



旋转:

旋转相比平移稍稍复杂:

设某点与原点连线和X轴夹角为b度,以原点为圆心,逆时针转过a度  , 原点与该点连线长度为R, [x,y]为变换前坐标, [X,Y]为变换后坐标。

  x = Rcos(b) ; y = Rsin(b);

  X = Rcos(a+b) = Rcosacosb - Rsinasinb = xcosa - ysina; (合角公式)

  Y = Rsin(a+b) = Rsinacosb + Rcosasinb = xsina + ycosa ;



  用矩阵表示:

                              cosa   sina  0

[X, Y, 1] = [x, y, 1][-sina  cosa  0  ]

                               0        0     1

  cosa   sina  0

-sina  cosa  0  为旋转变换矩阵。

   0       0     1



缩放

设某点坐标,在x轴方向扩大 sx倍,y轴方向扩大 sy倍,[x,y]为变换前坐标, [X,Y]为变换后坐标。

X = sx*x; Y = sy*y;

则用矩阵表示:

                              sx    0    0

[X, Y, 1] = [x, y, 1][ 0    sy    0  ] ;
                              0     0     1
sx    0    0

0    sy    0  即为缩放矩阵。

0     0     1



2D基本的模型视图变换,就只有上面这3种,所有的复杂2D模型视图变换,都可以分解成上述3个。

比如某个变换,先经过平移,对应平移矩阵A, 再旋转, 对应旋转矩阵B,再经过缩放,对应缩放矩阵C.

则最终变换矩阵 T = ABC. 即3个矩阵按变换先后顺序依次相乘(矩阵乘法不满足交换律,因此先后顺序一定要讲究)。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2018-2-17 14:05:20 | 显示全部楼层
本帖最后由 /db_自贡黄明儒_ 于 2018-2-17 14:09 编辑

http://blog.csdn.net/popy007/article/details/1797121
“齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。”—— F.S. Hill, JR
由于齐次坐标使用了4个分量来表达3D概念,使得平移变换可以使用矩阵进行,从而如F.S. Hill, JR所说,仿射(线性)变换的进行更加方便。由于图形硬件已经普遍地支持齐次坐标与矩阵乘法,因此更加促进了齐次坐标使用,使得它似乎成为图形学中的一个标准。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1336个

财富等级: 财源广进

发表于 2018-2-17 17:00:50 | 显示全部楼层
黄工新年好!精神可嘉!过年不打烊
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2018-2-17 17:31:17 | 显示全部楼层
图形的几何变换,数学基础研究已经非常的完善了。如果不想探究原理,可以直接拿来用就行了,不同变换的矩阵左乘,就能得到最终的变换矩阵。 一次变换就得到最终结果了。 数学很奇妙。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6056个

财富等级: 富甲天下

发表于 2018-2-18 00:01:21 | 显示全部楼层
学习一下。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2018-2-18 12:15:55 | 显示全部楼层
nenselp函数,就能获得一个块内实体 到WCS的变换矩阵
命令: (nentselp)

选择对象: (<图元名: 7ff766405910> (2446.64 700.155 0.0) ((1.0 0.0 0.0 2428.47) (0.0
1.0 0.0 708.095) (0.0 0.0 1.0 0.0) (0.0 0.0 0.0 1.0)) (<图元名: 7ff766405920>))


通过它,你就可以把块内实体原位置到拷贝生成到模型空间。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2018-2-18 23:37:12 | 显示全部楼层
获得INSERT实体的变换矩阵

  1. ;; gc:EnameMatrix (gile)
  2. ;; Returns the transformation matrix of a block reference,
  3. ;; the same as the one returnd by (caddr (nentselp)).
  4. ;;
  5. ;; Argument
  6. ;; ename : entity name of the block reference
  7. (defun gc:EnameMatrix (ename / trp mxv mxm elst ang norm mat)
  8.   ;; TRP
  9.   ;; Transpose a matrix -Doug Wilson-
  10.   (defun trp (m) (apply 'mapcar (cons 'list m)))
  11.   ;; MXV
  12.   ;; Apply a transformation matrix to a vector -Vladimir Nesterovsky-
  13.   (defun mxv (m v)
  14.     (mapcar (function (lambda (r) (apply '+ (mapcar '* r v))))
  15.             m
  16.     )
  17.   )
  18.   ;; MXM
  19.   ;; Multiply two matrices -Vladimir Nesterovsky-
  20.   (defun mxm (m q)
  21.     (mapcar (function (lambda (r) (mxv (trp q) r))) m)
  22.   )
  23.   ;; Main
  24.   (setq        elst (entget ename)
  25.         ang  (cdr (assoc 50 elst))
  26.         norm (cdr (assoc 210 elst))
  27.   )
  28.   (append
  29.     (mapcar
  30.       (function (lambda (v1 v2) (append v1 (list v2))))
  31.       (setq
  32.         mat (mxm (mapcar (function (lambda (v) (trans v 0 norm T)))
  33.                          '((1. 0. 0.) (0. 1. 0.) (0. 0. 1.))
  34.                  )
  35.                  (mxm (list (list (cos ang) (- (sin ang)) 0.)
  36.                             (list (sin ang) (cos ang) 0.)
  37.                             '(0. 0. 1.)
  38.                       )
  39.                       (list (list (cdr (assoc 41 elst)) 0. 0.)
  40.                             (list 0. (cdr (assoc 42 elst)) 0.)
  41.                             (list 0. 0. (cdr (assoc 43 elst)))
  42.                       )
  43.                  )
  44.             )
  45.       )
  46.       (mapcar
  47.         '-
  48.         (trans (cdr (assoc 10 elst)) norm 0)
  49.         (mxv mat
  50.              (cdr (assoc 10 (tblsearch "BLOCK" (cdr (assoc 2 elst)))))
  51.         )
  52.       )
  53.     )
  54.     '((0. 0. 0. 1.))
  55.   )
  56. )



测试代码:

  1. (defun c:tt (/ butlast uniformp ms sel num ent mat ent lst)
  2.   (vl-load-com)
  3.   (or *acad* (setq *acad* (vlax-get-acad-object)))
  4.   (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*)))
  5.   (or *blocks* (setq *blocks* (vla-get-Blocks *acdoc*)))

  6.   ;; butlast
  7.   ;; Return the list but last item
  8.   (defun butlast (l) (reverse (cdr (reverse l))))

  9.   ;; uniformp
  10.   ;; Evaluate if a 4x4 transformation matrix is uniformly scaled
  11.   (defun uniformp (m)
  12.     (setq m (butlast (mapcar 'butlast m)))
  13.     (vl-every
  14.       (function
  15.         (lambda        (v)
  16.           (equal (distance '(0. 0. 0.) (car m))
  17.                  (distance '(0. 0. 0.) v)
  18.                  1e-12
  19.           )
  20.         )
  21.       )
  22.       m
  23.     )
  24.   )

  25.   ;; Main
  26.   (setq ms (vla-get-ModelSpace *acdoc*))
  27.   (if (setq sel (ssget "_:L" '((0 . "INSERT"))))
  28.     (repeat (setq num (sslength sel))
  29.       (setq mat (gc:EnameMatrix (setq ent (ssname sel (setq num (1- num))))))
  30.       (if (uniformp mat)
  31.         (progn
  32.           (setq lst nil)
  33.           (vlax-for o (vla-Item *blocks* (cdr (assoc 2 (entget ent))))
  34.             (if        (wcmatch (vla-get-ObjectName o) "AcDbCircle,AcDbPolyline")
  35.               (setq lst (cons o lst))
  36.             )
  37.           )
  38.           (foreach o (vlax-invoke *acdoc* 'CopyObjects lst ms)
  39.             (vla-transformby o (vlax-tmatrix mat))
  40.           )
  41.         )
  42.       )
  43.     )
  44.   )
  45.   (princ)
  46. )


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2018-2-19 01:09:55 | 显示全部楼层

这是我见过的块内对象原位拷贝最精简的。可以扩展窗选块内对象。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-26 22:53 , Processed in 0.329669 second(s), 57 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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