找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: brainstorm

[求助] 用矩阵旋转图元的方法,这样么写对么

[复制链接]

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-9-4 21:20:14 | 显示全部楼层

1、先转到WCS坐标系 mat1
2、WCS坐标系下变换 mat2
3、结果在转回UCS坐标系 mat3

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

使用道具 举报

已领礼包: 58个

财富等级: 招财进宝

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

使用道具 举报

已领礼包: 58个

财富等级: 招财进宝

 楼主| 发表于 2017-9-5 11:08:53 | 显示全部楼层

我试着弄了一下,不知道哪里不对,拖动时鼠标与物体是漂移的感觉帮忙看看哪里错了



  1. (defun c:tt1 ()

  2.   (defun mv (p)
  3.     (if        (not (equal oldP p 1e-3))
  4.       (progn
  5.         (setq mat2 (xdrx_matrix_settranslation mat (mapcar '- p oldP))
  6.               oldP p
  7.         )
  8.         (xdrx_entity_transform
  9.           ss
  10.           (xdrx_matrix_product mat3 mat2 mat1)
  11.         )
  12.       )
  13.     )
  14.     (princ (strcat "\n" (VL-PRINC-TO-STRING p)))
  15.   )
  16.   (setq mat (xdrx_matrix_identity 3))
  17.   (setq ss (ssget))
  18.   (setq        oldP  (trans (getpoint) 1 0)
  19.         lastp (trans (getvar "lastpoint")1 0)
  20.   )
  21.   (setq        mat1 (xdrx_matrix_aligncoordsys
  22.                (list (getvar "ucsorg")
  23.                      (getvar "ucsxdir")
  24.                      (getvar "ucsydir")
  25.                      (xdrx_vector_CrossProduct
  26.                        (getvar "ucsxdir")
  27.                        (getvar "ucsydir")
  28.                      )

  29.                )
  30.                (list
  31.                  '(0 0 0)
  32.                  '(1 0 0)
  33.                  '(0 1 0)
  34.                  '(0 0 1)
  35.                )
  36.              )
  37.   )
  38.   (setq        mat3 (xdrx_matrix_aligncoordsys
  39.                (list
  40.                  '(0 0 0)
  41.                  '(1 0 0)
  42.                  '(0 1 0)
  43.                  '(0 0 1)
  44.                )
  45.                (list (getvar "ucsorg")
  46.                      (getvar "ucsxdir")
  47.                      (getvar "ucsydir")
  48.                      (xdrx_vector_CrossProduct
  49.                        (getvar "ucsxdir")
  50.                        (getvar "ucsydir")
  51.                      )

  52.                )
  53.              )
  54.   )
  55.   (xdrx_drag_jig
  56.     "mv"
  57.     "select point"
  58.     ""
  59.     (+ 2 128)
  60.     0
  61.     lastp
  62.   )
  63. )


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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2017-9-5 12:35:38 | 显示全部楼层

你这种应用有两个写法,你的写法,因为在回调里面使用的点是WCS的,所以就不涉及到UCS的变换了,直接用MAT2就行了。
  1. (defun c:tt1 ()
  2.   (defun mv (p)
  3.     (if        (not (equal oldP p 1e-3))
  4.       (progn (setq mat2        (xdrx_matrix_settranslation mat (mapcar '- p oldP))
  5.                    oldP        p
  6.              )
  7.              (xdrx_entity_transform
  8.                ss
  9.                mat2
  10.              )
  11.       )
  12.     )
  13.   )
  14.   (setq mat (xdrx_matrix_identity 3))
  15.   (setq ss (ssget))
  16.   (setq        oldP  (trans (getpoint "\n基点:") 1 0)
  17.         lastp (trans (getvar "lastpoint") 1 0)
  18.   )
  19.   (xdrx_drag_jig "mv" "\nselect point:" "" (+ 2 128) 0 oldp)
  20. )



另外一种写法,用矩阵左乘,用UCS变换,那么你在回调里面处理的点就应该是当前UCS坐标系的点,因为你要把UCS的东西变到WCS,然后在变回来。
改成下面的:

  1. (defun c:tt1 ()
  2.   (defun mv (p)
  3.     (if        (not (equal oldP (setq p(trans p 0 1)) 1e-3))
  4.       (progn (setq mat2        (xdrx_matrix_settranslation mat (mapcar '- p oldP))
  5.                    oldP        p
  6.              )
  7.              (xdrx_entity_transform ss (xdrx_matrix_product mat1 mat2 mat3) )
  8.       )
  9.     )
  10.   )
  11.   (setq mat (xdrx_matrix_identity 3))
  12.   (setq ss (ssget))
  13.   (setq        oldP  (getpoint "\n基点:"))
  14.   (setq mat1 (xdrx_matrix_ucs2wcs)
  15.         mat3 (xdrx_matrix_wcs2ucs)
  16.   )
  17.   (xdrx_drag_jig "mv" "\nselect point:" "" (+ 2 128) 0 oldp)
  18. )


另外,你用了 xdrx_matrix_aligncoordsystem求WCS到UCS,UCS到WCS的矩阵是可以的,但API直接有WCS到UCS,UCS到WCS的变换矩阵
(xdrx_matrix_ucs2wcs)
(xdrx_matrix_wcs2ucs)
这两个函数里面的具体实现是用你用的aligncoordsystem实现的。
aligncoordsystem更通用,不一定求当前的UCS,任意两个坐标系都可以求。也就是说,你可以在地球上,把太阳上的东西给搬到火星上。不一定得身在“火星“或”太阳上”。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2017-9-5 12:40:46 | 显示全部楼层

支持非等比
函数

(xdrx_entity_xcopy <实体..选择集> <矩阵>)
(xdrx_entity_xtransform <实体..选择集> <矩阵>)


支持的实体: INSERT,*POLYLINE,SPLINE,ARC,CIRCLE,ELLIPSE,LINE,TEXT,HATCH,DIMENSION....

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

使用道具 举报

已领礼包: 58个

财富等级: 招财进宝

 楼主| 发表于 2017-9-5 14:44:38 | 显示全部楼层

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-19 18:34 , Processed in 0.261068 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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