马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
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
- xdrx_matrix_SetTranslation
- 功 能:设置一个矩阵的平移向量
- 调用格式:(xdrx_matrix_SetTranslation <2d or 3d矩阵> <平移向量>)
- 返 回 值:矩阵
- 说 明: <平移向量>--对2D矩阵,是2D 向量
- 对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、2D转换矩阵
- (xdrx_matrix_setMirror <2d矩阵> <镜像点>)
- (xdrx_matrix_setMirror <2d矩阵> <镜像线>)
- 2、3D转换矩阵
- (xdrx_matrix_setMirror <3d矩阵> <镜像点>)
- (xdrx_matrix_setMirror <2d矩阵> <镜像线>)
- (xdrx_matrix_setMirror <2d矩阵> <镜像面>)
- 返 回 值:矩阵
- 说 明:对2D矩阵,点都要给2D点。
- [镜像线]-- (线起点 线终点)
- [镜像面]-- (点1 点2 点3) 满足右手定则的时针顺序3个点表示一个平面。
- 例子:
- Command: !a
- ((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)) ;矩阵
- Command: !l
- ((2922.82 -2479.0 0.0) (8768.45 7657.35 0.0)) ;;线
- Command: (setq c (xdrx_matrix_setmirror a l)) ;;镜像
- ((-0.500844 0.865537 0.0 -24405.6)
- (0.865537 0.500844 0.0 -13584.6)
- (0.0 0.0 -1.0 0.0)
- (0.0 0.0 0.0 1.0)
- )
_$ (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
- xdrx_matrix_setRotation
- 功 能:设置转换矩阵的旋转角
- 调用格式:1、2D转换矩阵
- (xdrx_matrix_setRotation <2d矩阵> <角度弧度值> <2D基点>)
- 2、3D转换矩阵
- (xdrx_matrix_setRotation <3d矩阵> <角度弧度值> <转轴向量> <基点>)
- 返 回 值:旋转矩阵
复制代码
$ (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度拷贝选择集
- ($xdrx_load "xdlsp.lsp")
- (defun c:test (/ matrix ss box)
- (setq ss (ssget))
- (xdrx_setsstodb ss 0)
- ;;选择集包围盒
- (setq box (xdrx_entity_box ss))
- ;;构造3D偏移矩阵-至包围盒左下角点
- (setq matrix (xdrx_matrix_settranslation
- (xdrx_matrix_identity 3)
- (car box)
- )
- )
- ;;绕Z轴旋转
- (xdrx_entity_transformedcopy
- ss
- (xdrx_matrix_setrotation matrix _pi2 '(0.0 0 1.0) '(0 0 0))
- )
- )
路径阵列中就是在等分点间构造偏移矩阵,然后根据点的切线方向用向量求转角后构
造旋转矩阵,最后用 xdrx_entity_transformedby 构造实体(选择集)的copy。
CAD中矩阵应用不外于点的转换、实体的复制、旋转、镜像,比如在copy时传统的写法是(command “_.copy" ss "" p1 p2) 用矩阵是这样写
- (xdrx_entity_transformedcopy
- ss
- (xdrx_matrix_settranslation
- (xdrx_matrix_identity 3)
- (mapcar '- p2 p1)
- )
- )
复制代码
单步的操作在代码上显示不出矩阵的优势(可能速度上略快),但进行一系列的操作
时,矩阵的优势就明显了,只要用矩阵的运算(偏移、缩放、旋转、镜像)构造最终
的矩阵,然后用xdrx_entity_transform或xdrx_entity_transformedcopy作用实体。 |