找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1307|回复: 4

[API应用]:[学习心得]XDAPI中几个矩阵类函数测试

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2003-3-5 11:33:15 | 显示全部楼层 |阅读模式

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

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

×
XDAPI中几个矩阵类函数测试

用两个单位矩阵测试:2D和3D矩阵

_$ (setq mat2 (xdrx_matrix_identity 2))
((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
_$ (setq mat3 (xdrx_matrix_identity 3))
((1.0 0.0 0.0 0.0) (0.0 1.0 0.0 0.0) (0.0 0.0 1.0 0.0) (0.0 0.0 0.0 1.0))

1 xdrx_matrix_settranslation

  1. xdrx_matrix_SetTranslation

  2. 功    能:设置一个矩阵的平移向量

  3. 调用格式:(xdrx_matrix_SetTranslation <2d or 3d矩阵> <平移向量>)

  4. 返 回 值:矩阵

  5. 说    明: <平移向量>--对2D矩阵,是2D 向量
  6.                        对3D矩阵, 是3D 向量
复制代码

_$ (xdrx_matrix_settranslation mat2 '(1.0 0.0))
nil
_$ (xdrx_matrix_settranslation mat2 '(0.0 0.0))
nil
_$ (xdrx_matrix_settranslation mat2 '(0.0 10.0))
nil
_$ (xdrx_matrix_settranslation mat2 '(10.0 10.0))
nil
_$ (xdrx_matrix_settranslation mat3 '(10 10 0))
nil
$ (xdrx_matrix_settranslation mat3 '(10.0 10.0 0))
((1.0 0.0 0.0 10.0) (0.0 1.0 0.0 10.0) (0.0 0.0 1.0 0.0) (0.0 0.0 0.0 1.0))
_$ (xdrx_matrix_settranslation mat3 '(10.0 10 0))
((1.0 0.0 0.0 10.0) (0.0 1.0 0.0 10.0) (0.0 0.0 1.0 0.0) (0.0 0.0 0.0 1.0))

结论:3D平移时第一个数必须是real,2D矩阵偏移失败。

2  xdrx_matrix_setmirror

  1. 功    能:构造镜像矩阵

  2. 调用格式:1、2D转换矩阵
  3.                 (xdrx_matrix_setMirror <2d矩阵> <镜像点>)
  4.                 (xdrx_matrix_setMirror <2d矩阵> <镜像线>)

  5.           2、3D转换矩阵

  6.                 (xdrx_matrix_setMirror <3d矩阵> <镜像点>)
  7.                 (xdrx_matrix_setMirror <2d矩阵> <镜像线>)
  8.                 (xdrx_matrix_setMirror <2d矩阵> <镜像面>)

  9. 返 回 值:矩阵

  10. 说    明:对2D矩阵,点都要给2D点。
  11.           [镜像线]-- (线起点 线终点)
  12.           [镜像面]-- (点1 点2 点3) 满足右手定则的时针顺序3个点表示一个平面。

  13. 例子:

  14. Command: !a
  15. ((1.0 0.0 0.0 -30937.9) (0.0 1.0 0.0 -9817.43) (0.0 0.0 1.0 0.0) (0.0 0.0 0.0 1.0)) ;矩阵
  16. Command: !l
  17. ((2922.82 -2479.0 0.0) (8768.45 7657.35 0.0)) ;;线
  18. Command: (setq c (xdrx_matrix_setmirror a l)) ;;镜像
  19. ((-0.500844 0.865537 0.0 -24405.6)
  20. (0.865537 0.500844 0.0 -13584.6)
  21. (0.0 0.0 -1.0 0.0)
  22. (0.0 0.0 0.0 1.0)
  23. )

_$ (xdrx_matrix_setmirror mat2 '(3 2))
nil
_$ (xdrx_matrix_setmirror mat2 '(3.0 2))
nil
_$ (xdrx_matrix_setmirror mat2 '(3.0 2.0))
nil
_$ (xdrx_matrix_setmirror mat2 '(3.0 5.0) '(3.0 2.0))
nil
_$ (xdrx_matrix_setmirror mat3 '(3 5 0))
((1.0 0.0 0.0 0.0) (0.0 1.0 0.0 0.0) (0.0 0.0 -1.0 0.0) (0.0 0.0 0.0 1.0))
_$ (xdrx_matrix_setmirror mat2 '(3 5 0) '(3 2 0))
nil
_$ (xdrx_matrix_setmirror mat2 '(3.0 5.0 0.0) '(3.0 2.0 0.0))
nil
_$ (xdrx_matrix_setmirror mat2 '(3.0 5.0 1.0) '(3.0 2.0 0.0))
nil
_$
_$ (setq l '((3.0 5.0) (3.0 2.0)))
((3.0 5.0) (3.0 2.0))
_$ (xdrx_matrix_setmirror mat2 l)
nil
_$ (xdrx_matrix_setmirror mat3 l)
((1.0 0.0 0.0 0.0) (0.0 1.0 0.0 0.0) (0.0 0.0 1.0 0.0) (0.0 0.0 0.0 1.0))
_$
为何?

3 xdrx_matrix_setRotation

  1. xdrx_matrix_setRotation

  2. 功    能:设置转换矩阵的旋转角

  3. 调用格式:1、2D转换矩阵
  4.             (xdrx_matrix_setRotation <2d矩阵> <角度弧度值> <2D基点>)

  5.           2、3D转换矩阵
  6.             (xdrx_matrix_setRotation <3d矩阵> <角度弧度值> <转轴向量> <基点>)

  7. 返 回 值:旋转矩阵
复制代码


$ (setq mat0 (xdrx_matrix_settranslation mat3 '(30.0 20 0)))
((1.0 0.0 0.0 30.0) (0.0 1.0 0.0 20.0) (0.0 0.0 1.0 0.0) (0.0 0.0 0.0 1.0))
_$ (xdrx_matrix_setrotation mat0 (/ pi 3) '(1.0 0.0 0.0) '(30 20 0))
((1.0 0.0 0.0 30.0) (0.0 0.5 -0.866025 30.0) (0.0 0.866025 0.5 -17.3205) (0.0 0.0 0.0 1.0))
_$ (xdrx_matrix_setrotation mat0 (/ pi 3) '(1.0 0.0 0.0) '(0 0 0))
((1.0 0.0 0.0 30.0) (0.0 0.5 -0.866025 20.0) (0.0 0.866025 0.5 0.0) (0.0 0.0 0.0 1.0))
_$
补充说明:基点是相对(xdrx_matrix_Translation matrix)的点。
应用示例:
旋转90度拷贝选择集

  1. ($xdrx_load "xdlsp.lsp")
  2. (defun c:test (/ matrix ss box)
  3.   (setq ss (ssget))
  4.   (xdrx_setsstodb ss 0)
  5.   ;;选择集包围盒
  6.   (setq box (xdrx_entity_box ss))
  7.   ;;构造3D偏移矩阵-至包围盒左下角点
  8.   (setq        matrix (xdrx_matrix_settranslation
  9.                  (xdrx_matrix_identity 3)
  10.                  (car box)
  11.                )
  12.   )
  13.   ;;绕Z轴旋转
  14.   (xdrx_entity_transformedcopy
  15.     ss
  16.     (xdrx_matrix_setrotation matrix _pi2 '(0.0 0 1.0) '(0 0 0))
  17.   )
  18. )

路径阵列中就是在等分点间构造偏移矩阵,然后根据点的切线方向用向量求转角后构
造旋转矩阵,最后用 xdrx_entity_transformedby 构造实体(选择集)的copy。

CAD中矩阵应用不外于点的转换、实体的复制、旋转、镜像,比如在copy时传统的写法是(command “_.copy" ss "" p1 p2) 用矩阵是这样写

  1. (xdrx_entity_transformedcopy
  2.   ss
  3.   (xdrx_matrix_settranslation
  4.     (xdrx_matrix_identity 3)
  5.     (mapcar '- p2 p1)
  6.   )
  7. )
复制代码

单步的操作在代码上显示不出矩阵的优势(可能速度上略快),但进行一系列的操作
时,矩阵的优势就明显了,只要用矩阵的运算(偏移、缩放、旋转、镜像)构造最终
的矩阵,然后用xdrx_entity_transform或xdrx_entity_transformedcopy作用实体。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-3-8 23:55:31 | 显示全部楼层
我都贴了几个了,你才测试,骗分哪:)
关键是有xdrx_entity_transform或xdrx_entity_transformedcopy,vlisp也有transformby,但是转换矩阵好象要自己算.(还是我不知道?).
xdapi真是厉害呀.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-3-8 23:59:41 | 显示全部楼层
最初由 aeo 发布
[B]我都贴了几个了,你才测试,骗分哪:)
关键是有xdrx_entity_transform或xdrx_entity_transformedcopy,vlisp也有transformby,但是转换矩阵好象要自己算.(还是我不知道?).
xdapi真是厉害呀. [/B]


:)

API除了对实体进行矩阵变换,提供了xdrx_entity_transform或xdrx_entity_transformedcopy,还可以对点进行变换,xdrx_point_transform,这个对写程序帮助更大,画图离不开点,灵活的构造点事半功倍。

你用XDRX_API 就是用LISP语言完成ARX的功能。习惯API后,如果学ARX,也会有帮助的。使用API的好处就是使用ARX的功能和开发思路,并且LISP代码非常短就可以完成复杂的功能。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2003-3-9 00:07:17 | 显示全部楼层
最初由 aeo 发布
[B]我都贴了几个了,你才测试,骗分哪:)
关键是有xdrx_entity_transform或xdrx_entity_transformedcopy,vlisp也有transformby,但是转换矩阵好象要自己算.(还是我不知道?).
xdapi真是厉害呀. [/B]

我只是研究用LSP写矩阵转换,才写这些。
其中发现几个函数与手册有出入,比如setmirror,还有实数与整数区别还有其他的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-8 21:34 , Processed in 0.527463 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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