明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2427|回复: 8

MATRIX

[复制链接]
发表于 2005-5-11 13:05:00 | 显示全部楼层 |阅读模式
利用nentselp提供了一个矩阵A,可以把块里的子实体上的点(实体模型坐标)p(x,y,z)


--->转成p'(x' ,y',z')世界坐标的点=A * P(X,Y,Z)


如果我想进行反向的转换,把p'(x' ,y',z')世界坐标的点--》转成实体模型坐


标)p(x,y,z),那就是p(x,y,z)=A的逆矩阵         * p(x', y,' z')


我的问题是, 矩阵A如何转成A的逆矩阵,


各位高手是否有现成的程序提供,autolisp里没有现成的函数,高手们能不能帮忙写一个


这样的函数,这样对于修改块里的子实体就非常有用了。


我的程序就在这里卡住了。。。。


发表于 2005-5-11 17:09:00 | 显示全部楼层
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=4718&replyID=18422 把修改块里的子实体程序写好再贴上来好吗?
发表于 2005-5-11 17:11:00 | 显示全部楼层
要逆矩阵做什么?


看trans函数,可以将坐标从用户坐标转到世界坐标,也可以从世界坐标转到用户坐标,,,具体用法见帮助中介绍
发表于 2005-5-11 17:18:00 | 显示全部楼层
逆矩阵正如dandee所说非常有用,多年前我写过一个往图块增加物件的程序,由於点选的图块可能经过旋转,缩放,镜射,逆矩阵能把物件退回原位置,然后再把物件加入图块,位置才会正确,但autocad对逆矩阵只支持等比图块.
 楼主| 发表于 2005-5-11 23:51:00 | 显示全部楼层
龙龙仔 万万分的感谢 , 这么快就给我回复了 , 非常完美, 省去了我不少时间去研究 matrix computation ,其实矩阵在 autocad里 应用是非常广泛的 , 把矩阵作用到点上,就可以把点在不同坐标系下变换,作用到实体上,就会对实体变换,在ACAD内部,不知道什么是移动、拷贝、旋转、镜像、投影变换等等,知道的只是一个对象和一个要对对象操作的变换矩阵。大家掌握了矩阵的方法,很多应用都可以得心应手。 meflying :最初我也用了trans 但trans 还有不少有局限的地方, 并不支持无名块下的这种坐标转换。 幸好还有nentselp这个函 数。 由于我的程序不只正对块的修改 , 过于冗长 , 这里 贴一个 , “只修改块里子实 体line的 起 始 点 (10 x y z )“, 是 块的实体模型坐标p(x,y,z) 与 世界坐标的点p'(x' ,y',z') 相互转换的应用 以供大家参考修改
(defun c:mt( / ene enii eni ent etc enn enu)
(setq ene (nentselp "\nSelect Sub-Entity of Block:"))
(setq enii (last (nth 3 ene)))


(setq eni (car ene))
(setq ent (entget eni '("*") ))
(setq etc (cdr (assoc 10 ent))) (setq enn (nth 2 ene))
(princ "\n Point [mcs--> wcs] ")
(princ (matrx-point enn etc))


(setq etw (getpoint "\n Modify Point:"))
(setq enu (ea:matrix_inverse enn))
(princ "\n Point [wcs--> mcs] ")
(princ (matrx-point enu etw))


(setq ent (subst (cons 10 ecw) (assoc 10 ent) ent))
(entmod ent)
(entupd eni)
(entupd enii)

(princ)
) (defun mwc(mcsp mtx_row )
(+ (* (nth 0 mcsp)(nth 0 mtx_row))
(* (nth 1 mcsp)(nth 1 mtx_row))
(* (nth 2 mcsp)(nth 2 mtx_row))
(nth 3 mtx_row) )
) (defun matrx-point(matrxm etp / xx yy zz)
(setq xx (nth 0 matrxm) yy (nth 1 matrxm) zz (nth 2 matrxm) et_p etp)
(setq ecw (list (mwc et_p xx)(mwc et_p yy)(mwc et_p zz)))
) (defun ea:matrix_inverse (matrix / m0 m1 m2 m3
m00 m01 m02 m03 m10 m11
m12 m13 m20 m21 m22 m23
_a ea:determinant a11 a12
a21 a22 a33 a34 a41 a42
a43 a13 a23 a31 a32
) (defun ea:determinant (a00 a01 a02 a10 a11 a12 a20 a21 a22 /)
(- (+ (* a00 a11 a22)
(* a01 a12 a20)
(* a02 a21 a10)
)
(* a02 a11 a20)
(* a01 a10 a22)
(* a00 a21 a12)
)
)
(setq m0 (car matrix)
m1 (cadr matrix)
m2 (nth 2 matrix)
m3 (last matrix)
)
(setq m00 (car m0)
m01 (cadr m0)
m02 (nth 2 m0)
m03 (last m0)
)
(setq m10 (car m1)
m11 (cadr m1)
m12 (nth 2 m1)
m13 (last m1)
)
(setq m20 (car m2)
m21 (cadr m2)
m22 (nth 2 m2)
m23 (last m2)
)
(setq a11 (ea:determinant m11 m12 m13 m21 m22 m23 0.0 0.0 1.0)
a12 (- (ea:determinant m10 m12 m13 m20 m22 m23 0.0 0.0 1.0))
a13 (ea:determinant m10 m11 m13 m20 m21 m23 0.0 0.0 1.0)
a21 (- (ea:determinant m01 m02 m03 m21 m22 m23 0.0 0.0 1.0))
a22 (ea:determinant m00 m02 m03 m20 m22 m23 0.0 0.0 1.0)
a23 (- (ea:determinant m00 m01 m03 m20 m21 m23 0.0 0.0 1.0))
a31 (ea:determinant m01 m02 m03 m11 m12 m13 0.0 0.0 1.0)
a32 (- (ea:determinant m00 m02 m03 m10 m12 m13 0.0 0.0 1.0))
a33 (ea:determinant m00 m01 m03 m10 m11 m13 0.0 0.0 1.0)
a41 (- (ea:determinant m01 m02 m03 m11 m12 m13 m21 m22 m23))
a42 (ea:determinant m00 m02 m03 m10 m12 m13 m20 m22 m23)
a43 (- (ea:determinant m00 m01 m03 m10 m11 m13 m20 m21 m23)) )
(list (list a11 a21 a31 a41)
(list a12 a22 a32 a42)
(list a13 a23 a33 a43)
'(0.0 0.0 0.0 1.0)
)
)


发表于 2005-5-12 08:54:00 | 显示全部楼层
这种繁杂的事情我总是懒得去折腾,让你见笑了
发表于 2005-5-12 10:13:00 | 显示全部楼层
LLDet:Inverse        and more...


本帖子中包含更多资源

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

x
发表于 2005-5-12 12:33:00 | 显示全部楼层
alin兄:这类东西很久就收集了,只是用的人恐怕不多! 8-)
 楼主| 发表于 2005-5-12 13:30:00 | 显示全部楼层
alin :真牛!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-17 06:51 , Processed in 0.177274 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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