找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1116|回复: 20

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

[复制链接]

已领礼包: 58个

财富等级: 招财进宝

发表于 2017-9-2 11:26:03 | 显示全部楼层 |阅读模式

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

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

×
刚接触矩阵,试着写了一个动态拖动旋转的联系,总是感觉写的太繁琐求指导一下,有什么其他好方法。我知道有封装的函数xdrx_drag_rotate
只是针对这个练习

  1. (defun c:tt ()
  2.   (defun callback (p)
  3.     (if        (not p1)
  4.       (setq p1 p)
  5.     )
  6.     (if        (not an0)
  7.       (setq an0 (angle p p0))
  8.     )
  9.     (if        (not (equal p p1 1e-3))
  10.       (progn
  11.         (setq an1 (angle p1 p0))
  12.         (setq an0 (- (angle p p0) an1))
  13.         (setq p1 p)

  14.       )                                        ; point moved
  15.     )

  16.     (setq mat (xdrx_matrix_setrotation
  17.                 mat0
  18.                 an0
  19.                 '(0 0 1)
  20.                 p0
  21.               )
  22.     )
  23.     (xdrx_entity_transform e mat)
  24.     (princ an0)
  25.   )
  26.   (setq mat0 (xdrx_matrix_identity 3))
  27.   (setq        e  (car (entsel))
  28.         p0 (getpoint)
  29.   )
  30.   (xdrx_pointmonitor "callback")
  31.   (getpoint p0)
  32.   (xdrx_pointmonitor)
  33. )

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

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-9-3 03:55:16 | 显示全部楼层
本帖最后由 newer 于 2017-9-3 04:00 编辑

你这个 (setq an1 (angle p1 p0)) 有点复杂了,点顺序反了 用 (angle p0 p)) 就简洁多了,因为p0是基点。

可以简化下,另外,你的代码在UCS下还不对,试试下面代码,UCS也也行

  1. (defun c:tt ()
  2.   (defun callback (p)
  3.     (if        (not (equal p p0 1e-3))
  4.       (progn
  5.         (setq an0 (angle p0 p))
  6.         (setq an1 (- an0 oldan))
  7.         (setq mat
  8.                (xdrx_matrix_setrotation mat0 an1 '(0 0 1) p0)
  9.         )
  10.         (xdrx_entity_transform e mat)
  11.         (setq oldan an0)
  12.       )
  13.     )
  14.   )
  15.   (setq mat0 (xdrx_matrix_identity 3))
  16.   (setq        e     (car (entsel))
  17.         xdir  (getvar "ucsxdir")
  18.         ucsan (xdrx_vector_angle xdir)
  19.         oldan ucsan
  20.         p0    (getpoint "\n基点:")
  21.         p0 (trans p0 1 0)
  22.   )
  23.   (xdrx_pointmonitor "callback")
  24.   (getpoint (trans p0 0 1))
  25.   (xdrx_pointmonitor)
  26. )


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

使用道具 举报

已领礼包: 58个

财富等级: 招财进宝

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-9-3 13:15:10 | 显示全部楼层


1、

(defun callback(dynpt)
   ...
)

点监视器回调函数的参数,dynpt是WCS点




2、getpoint 是UCS点


3、angle 求的是和当前UCS X轴的夹角




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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-9-3 13:51:48 | 显示全部楼层

你试试实现下下面这个动态,地球绕太阳公转,自身自转。

1、多段线跟着鼠标走,位置是多段线的重心和鼠标点重合
2、走的同时,随着鼠标和基点连线的方向,多段线自身绕重心点旋转,每次10度
3、旋转方向同鼠标移动的时针方向,鼠标连线顺时针,自转也顺时针,逆时针,自转也逆时针。

看看矩阵怎么实现。

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

使用道具 举报

已领礼包: 58个

财富等级: 招财进宝

 楼主| 发表于 2017-9-3 20:07:04 来自手机 | 显示全部楼层
newer 发表于 2017-9-3 13:51

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

使用道具 举报

已领礼包: 58个

财富等级: 招财进宝

 楼主| 发表于 2017-9-4 09:06:05 | 显示全部楼层
rotate01.gif

  1. (defun c:tt ()
  2.   (defun callback (p)
  3.     (if        (not (equal p p0 1e-3))
  4.       (progn
  5.         (setq an0 (angle p0 p))
  6.         (setq an1 (- an0 oldan))
  7.         (setq mat
  8.                (xdrx_matrix_setrotation mat0 an1 '(0 0 1) p0)
  9.         )
  10.         (xdrx_entity_transform e mat)
  11.         (setq pcent (xd::polyline:centroid e)
  12.               pcent (trans pcent 1 0)
  13.         )
  14.         (setq mat
  15.                (xdrx_matrix_setrotation mat0 (* 10.0 an1) '(0 0 1) pcent)
  16.         )
  17.         (xdrx_entity_transform e mat)
  18.         (setq oldan an0)
  19.       )
  20.     )
  21.   )
  22.   (setq mat0 (xdrx_matrix_identity 3))
  23.   (setq        e     (car (entsel))
  24.         p0    (getpoint "\n基点:")
  25.         p0    (trans p0 1 0)
  26.         pcent (xd::polyline:centroid e)
  27.         pcent (trans pcent 1 0)
  28.         oldan (angle p0 pcent)
  29.   )
  30.   (xdrx_pointmonitor "callback")
  31.   (getpoint (trans p0 0 1))
  32.   (xdrx_pointmonitor)
  33. )

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-9-4 09:31:00 | 显示全部楼层

能转了,但是中心没移动到鼠标点

搜狗截图20170904092050.png

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

使用道具 举报

已领礼包: 58个

财富等级: 招财进宝

 楼主| 发表于 2017-9-4 10:07:48 | 显示全部楼层
rotate2.gif

  1. (defun c:tt ()
  2.   (defun callback (p)
  3.     (if        (not (equal p p0 1e-3))
  4.       (progn
  5.         (setq an0 (angle p0 p))
  6.         (setq an1 (- an0 oldan))
  7.         (setq mat
  8.                (xdrx_matrix_setrotation mat0 an1 '(0 0 1) p0)
  9.         )
  10.         (xdrx_entity_transform e mat)
  11.         (setq pcent (xd::polyline:centroid e)
  12.               pcent (trans pcent 1 0)
  13.         )
  14.         (setq mat
  15.                (xdrx_matrix_setrotation mat0 (* 10.0 an1) '(0 0 1) pcent)
  16.         )
  17.        
  18.         (xdrx_entity_transform e mat)
  19.         (setq mat
  20.              (xdrx_matrix_settranslation mat0 (mapcar '- p pcent ))
  21.         )
  22.         (xdrx_entity_transform e mat)
  23.         (setq oldan an0)
  24.       )
  25.     )
  26.   )
  27.   (setq mat0 (xdrx_matrix_identity 3))
  28.   (setq        e     (car (entsel))
  29.         p0    (getpoint "\n基点:")
  30.         p0    (trans p0 1 0)
  31.         pcent (xd::polyline:centroid e)
  32.         pcent (trans pcent 1 0)
  33.         oldan (angle p0 pcent)
  34.   )
  35.   (xdrx_pointmonitor "callback")
  36.   (getpoint (trans p0 0 1))
  37.   (xdrx_pointmonitor)
  38. )

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-9-4 10:41:44 | 显示全部楼层

很完美了,就一个地方修改下,现在的回调函数里面,用了三次的矩阵变换实体,其实用一次就可以,这也是矩阵神奇的地方,也是数学神奇的地方。不管中间有多少次变换矩阵,这些变换矩阵可以矩阵左乘,组合成一个最终的变换矩阵,实体作用这个最终的变换矩阵,变换一次,实体就变换到最终的位置,这节省了很多的时间和消耗。看过不少专业的软件,中间变换好几次,每次都重新生成实体,本来几秒完成的事,用了几十倍上百倍的时间。

你用了三个矩阵,按照最终变换顺序的反向,使用xdrx_matrix_product 矩阵左乘组合成最终的变换矩阵

(setq mat (xdrx_matrix_product mat3 mat2 mat1))

试试下面的。


  1. (defun c:tt ()
  2.   (defun callback (p)
  3.     (if        (not (equal p p0 1e-3))
  4.       (progn
  5.         (setq an0 (angle p0 p))
  6.         (setq an1 (- an0 oldan))
  7.         (setq mat1
  8.                (xdrx_matrix_setrotation mat0 an1 '(0 0 1) p0)
  9.         )
  10.         (setq pcent (xd::polyline:centroid e)
  11.               pcent (trans pcent 1 0)
  12.         )
  13.         (setq mat2
  14.                (xdrx_matrix_setrotation mat0 (* 10.0 an1) '(0 0 1) pcent)
  15.         )
  16.         (setq mat3
  17.              (xdrx_matrix_settranslation mat0 (mapcar '- p pcent ))
  18.         )
  19.         (setq mat (xdrx_matrix_product mat3 mat2 mat1))
  20.         (xdrx_entity_transform e mat)
  21.         (setq oldan an0)
  22.       )
  23.     )
  24.   )
  25.   (setq mat0 (xdrx_matrix_identity 3))
  26.   (setq        e     (car (entsel))
  27.         p0    (getpoint "\n基点:")
  28.         p0    (trans p0 1 0)
  29.         pcent (xd::polyline:centroid e)
  30.         pcent (trans pcent 1 0)
  31.         oldan (angle p0 pcent)
  32.   )
  33.   (xdrx_pointmonitor "callback")
  34.   (getpoint (trans p0 0 1))
  35.   (xdrx_pointmonitor)
  36. )



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

使用道具 举报

已领礼包: 58个

财富等级: 招财进宝

 楼主| 发表于 2017-9-4 10:49:57 | 显示全部楼层
唉 我刚才正在试怎么先把矩阵变换好 然后依次tranform,我没有数学基础,基本都是靠看别人代码一点点实验 你这么一指点 我就明白了 太感谢你了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-9-4 10:59:12 | 显示全部楼层

这也不太需要数学基础,知道怎么用就行了,数学的计算都有现成的函数。知道怎么算出矩阵,就那么几种,平移,缩放,旋转,镜像,对齐。然后左乘就够了。精力放到算法的实现上。

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

使用道具 举报

已领礼包: 58个

财富等级: 招财进宝

 楼主| 发表于 2017-9-4 11:03:01 来自手机 | 显示全部楼层
newer 发表于 2017-9-4 10:59

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

使用道具 举报

已领礼包: 5060个

财富等级: 富甲天下

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

使用道具 举报

已领礼包: 58个

财富等级: 招财进宝

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-23 06:34 , Processed in 0.255803 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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