Hippe013 发表于 2022-7-5 18:10:06

变换矩阵的逆

我有以下代码,它使用NENTSEL返回的转换矩阵将点从模型转换到世界。
 
(defun SXH:transmatrix (mat p)
   (setq x (+
      (* (car (nth 0 mat)) (car p))
      (* (car (nth 1 mat)) (cadr p))
      (* (car (nth 2 mat)) (caddr p))
      (car (nth 3 mat))))
   (setq y (+
      (* (cadr (nth 0 mat)) (car p))
      (* (cadr (nth 1 mat)) (cadr p))
      (* (cadr (nth 2 mat)) (caddr p))
      (cadr (nth 3 mat))))
   (setq z (+
      (* (caddr (nth 0 mat)) (car p))
      (* (caddr (nth 1 mat)) (cadr p))
      (* (caddr (nth 2 mat)) (caddr p))
      (caddr (nth 3 mat))))
   (list x y z)
   )
 
我需要从世界转变为模型。我该如何设置这个逆矩阵?
 
感谢您的帮助!
 
当做
 
Hippe013

Lee Mac 发表于 2022-7-5 18:22:51

下面是编写函数的另一种方法(从这里使用mxv):
请注意,由于此处所述的矩阵结构不同,这仅适用于nentsel矩阵,而不适用于nentselp矩阵。
 
为了求逆矩阵,您可以从这里使用invm函数——不过,您需要将矩阵转换为一个方阵,正如nentselp返回的那样。

Hippe013 发表于 2022-7-5 18:27:36

李,
 
我感谢你的帮助!您有一种非常优雅的代码编写方式。
 
(mapcar '+ (mxv (reverse (cdr (reverse mat))) p) (last mat))
 
工作得很有魅力!
 
所以我的下一个问题是如何将由NENTSEL返回的矩阵转换为INVM函数所需的平方矩阵?

Lee Mac 发表于 2022-7-5 18:33:28

非常感谢。
 
 
矩阵被转置,nentsel矩阵中的向量行成为nentselp矩阵中的最后一列,并具有额外的(0 0 1)行以生成方形矩阵-这在上面提供的链接I中进行了描述,在链接帖子中,我还提供了执行此转换的函数。
 
然而,为什么不简单地使用nentselp而不是nentsel呢?

Hippe013 发表于 2022-7-5 18:45:42

李,
 
我已经有一段时间没有处理转换了。我目前正在从事一个ObjectDBX项目,在该项目中,我从一个成功的外部参照复制对象。接下来我需要做的是变换所有复制的对象。我有一个vla对象的变体,由vla CopyObjects返回,矩阵由nentsel返回。你会怎么做?
 
任何帮助,我们都将不胜感激。
 
当做
 
Hippe013

Hippe013 发表于 2022-7-5 18:50:23

李,
 
此外,我想知道如何将nentsel返回的矩阵转换为vlax TMatrix所需的矩阵。
 
当做
 
Hippe013

Hippe013 发表于 2022-7-5 19:02:10

别担心李!我想出来了!

Lee Mac 发表于 2022-7-5 19:09:08

 
请参阅:
http://www.theswamp.org/index.php?topic=39876.msg451779#msg451779
 
 
请参阅:
http://www.theswamp.org/index.php?topic=40546.msg458445#msg458445

Hippe013 发表于 2022-7-5 19:11:20

好啊所以,我已经阅读了你提供的链接,这是一个丰富的信息,谢谢你。我原以为我一切正常。我在具有外部参照的线上进行了测试,但在外部参照内的块上进行测试时,nentselp返回的矩阵与选择线时不同。这么说来,我想我需要使用外部参照本身的信息来构建矩阵。一、 e.插入点、x y z比例和旋转。我将不得不研究你的链接多一点,以找出如何建立说矩阵。非常感谢您的帮助!谢谢李。我的最终目标是在外部参照中选择一个对象,找出对象所在的图层,然后将同一图层上的所有对象复制到当前图形中,类似于ncopy,但所有对象都在同一图层上。
 
当做
Hippe013
页: [1]
查看完整版本: 变换矩阵的逆