找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1554|回复: 5

[分享]:用矩阵变换实体模拟ACAD的MIRROR命令(xdapi)

[复制链接]

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-5-4 21:49:50 | 显示全部楼层 |阅读模式

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

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

×
以前工具箱的“自由拷贝”“自由移动”
实体法线,文字等出现问题(反了)现在还是用xdapi解决之.
[php]
;|
模拟ACAD的MIRROR命令,但要比执行命令MIRROR效率高
完全模拟了ACAD的MIRROR命令,包括文字等
|;
(defun c:test( / e m0 m1 p1 p2 ss v x yorno)
  (if (and
        (progn
          (prompt "\n选取一个要镜像的实体<退出>:")
          (setq ss (ssget))
        )
        (xdrx_pickset_redraw ss 3)
        (xdrx_entsel "\n选取镜像线<退出>" '((0 . "line")))
      )
    (progn
      (setq yorno (xdrx_yesorno "\n是否删除原实体" 0))
      (setq p1 (xdrx_getentdxf 10)
            p2 (xdrx_getentdxf 11)
      )
      (xdrx_setsstodb ss 0)
      (while (setq e (xdrx_getentdata 0))
        (setq m0 (xdrx_matrix_identity 3)           ;|单位矩阵|;
              m1 (xdrx_matrix_setmirror m0 '(0 0 0))           ;法线反转矩阵,wcs到这里可以了.
              m1 (xdrx_matrix_product m1(xdrx_matrix_wcs2ucs)) ;
              m1 (xdrx_matrix_product (xdrx_matrix_ucs2wcs) m1) ;|ucs下的反转矩阵,
                                                                  和上面一句(wcs2ucs.m1.ucs2wcs)把法线反转矩阵,转成ucs下.|;
              m2 (xdrx_matrix_setmirror m0 (list p1 p2))  ;|镜像矩阵|;
              k (princ m2)
              mr (xdrx_matrix_product m1 m2) ;|矩阵左乘,先镜像后转法线矩阵|;     
        )
        (if (= yorno 1)
              (xdrx_entity_transform e mr)  ;相当下面两句
              ;(xdrx_entity_transform e m2)   ;镜像矩阵变换
              ;(xdrx_entity_transform e m1)   ;转法线.物体到了新位置后,再把法线转回到原来的.
          (progn
            (xdrx_entity_transformedcopy e m0)  ;镜像矩阵变换拷贝
            (xdrx_entity_transform(entlast)mr)  ;对变换拷贝到的新实体变法线.
                                                ;|  可以直接把法线改了,行吗:
                                                   那不行,因为实体的定义点没一起改过来.
                                                   矩阵变换实体时,同时对定义点和法线起作用.|;
          )
        )
      )
      (xdrx_pickset_redraw ss t)
    )
  )
  (princ)
)[/php]
欢迎大家一起讨论矩阵的问题.



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

已领礼包: 488个

财富等级: 日进斗金

 楼主| 发表于 2004-5-4 23:21:01 | 显示全部楼层
(xdrx_matrix_identity 3) ;产生一个标准的4维矩阵((1 0 0 0)(0 1 0 0)(0 0 1 0)(0 0 0 1))

(xdrx_matrix_product  m2 m1)  -->m1.m2   ;我的理解是m2作用于m1,物体先经过m1的转化,再m2转化.
所以一定要注意先后。
m1.m2.m3.m4.m5--> (product (product (product (product m5 m4)m3)m2)m1)

xdrx_matrix_setmirror  --> ((1 0 0 0)(0 1 0 0)(0 0 -1 0)(0 0 0 1))
作用于点(x y z),那么就z变为负值了.
;;;转换点
;;;       pt  (x y z 1)
;;;       mat (x0 x1 x2 x3)(y0 y1 y2 y3)(z0 z1 z2 z3)(0 0 0 1)
;;;-->   ( (x0*x + x1*y + x2*z + x3*1)
;;;        (y0*x + y1*y + y2*z + y3*1)
;;;        (z0*x + z1*Y + z2*z + z3*1)
;;;           1
;;;      )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-10-12 22:50:59 | 显示全部楼层
(xdrx_matrix_product m2 m1)  更通俗的说法是 "矩阵相乘", 是这样吧?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2004-10-12 23:21:18 | 显示全部楼层
最初由 梦断江南 发布
[B](xdrx_matrix_product m2 m1)  更通俗的说法是 "矩阵相乘", 是这样吧? [/B]

xdrx_matrix_Product

功    能:两个矩阵相乘

调用格式:(xdrx_matrix_Product < 2d or 3d矩阵 > < 2d or 3d 矩阵 >)

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

使用道具 举报

发表于 2004-10-13 14:35:17 | 显示全部楼层
为什么连续执行3次返回不同的结果??
(setq
      n1 '((1 0 0 0)(0 1 0 0)(0 0 1 0)(0 0 0 1))
      n2 '((2 0 0 1)(0 2 0 1)(0 0 0 1)(0 0 0 1))
      n3 '((1.4 1.4 0 0)(-1.4 1.4 0 0)(0 0 0 0)(0 0 0 1))
)

(xdrx_matrix_product n1 n2)

连续执行3次,返回:



((0.0 0.0 0.0 0.0) (2.3643e+156 0.0 1.4 0.0) (1.4 0.0 1.4 1.4) (-1.4 1.4 0.0 1.4))
_$

((0.0 0.0 0.0 0.0) (2.94378e+303 2.94336e+303 2.94294e+303 0.0) (0.0 0.0 0.0 0.0) (0.0 0.0 0.0 0.0))
_$

((0.0 4.16179e+303 4.18278e+303 4.18257e+303) (4.16118e+303 4.18219e+303 4.16101e+303 0.0) (0.0 0.0 2.84719e+303 0.0) (0.0 2.84719e+303 0.0 0.0))
_$

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

 楼主| 发表于 2004-10-13 22:44:06 | 显示全部楼层
xdrx_matrix_product
它不能判断整数和浮点数.
(xdrx_matrix_product n1 n2) --->都是0 ...

(setq
n1 '((1. 0. 0 0)(0 1. 0. 0.)(0. 0. 1. 0)(0. 0. 0. 1.))
n2 '((2. 0. 0. 1.)(0 2. 0. 1.)(0 0 0 1.)(0. 0 0 1.))
n3 '((1.4 1.4 0 0)(-1.4 1.4 0 0)(0 0 0 0)(0 0 0 1))
)


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-10 00:30 , Processed in 0.374461 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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