明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 201|回复: 7

SLdesign V3.0 《矩阵函数》

  [复制链接]
发表于 昨天 14:18 | 显示全部楼层 |阅读模式
SLdesign V3.0 集成的矩阵函数发布下


  1. ;;SLdesign V3.0 三领矩阵函数------[开始]---------
  2. ;;Modify by 尘缘一生   QQ:15290049
  3. ;;点的矩阵(4x4 matrix) 变换
  4. ;;输入:矩阵m和一个三维点p
  5. ;;输出:点变换后的位置
  6. (defun mat:mxp (m p)
  7.   (reverse (cdr (reverse (mat:mxv m (append (pt->3d p) '(1.0))))))
  8. )
  9. ;;----------------------
  10. ;; wcs到ucs矩阵,也可称ucs的变换矩阵
  11. (defun mat:w2u () (mat:trans 0 1))
  12. ;;-----------------------
  13. ;; ucs到wcs矩阵,也可称ucs的逆变换矩阵
  14. (defun mat:u2w () (mat:trans 1 0))
  15. ;;从一个坐标系统到另一个坐标系统的变换矩阵
  16. ;;输入:from - 源坐标系;to - 目的坐标系
  17. ;;输出:一个4X4的CAD变换矩阵
  18. (defun mat:trans (from to)
  19.   (append
  20.     (mat:trp
  21.       (list
  22.         (trans '(1 0 0) from to t)
  23.         (trans '(0 1 0) from to t)
  24.         (trans '(0 0 1) from to t)
  25.         (trans '(0 0 0) from to nil)
  26.       )
  27.     )
  28.     '((0. 0. 0. 1.))
  29.   )
  30. )
  31. ;; 向量或点的矩阵变换(向量乘矩阵)
  32. (defun mat:mxv (m v)
  33.   (mapcar (function (lambda (r) (apply '+ (mapcar '* r v)))) m)
  34. )
  35. ;;平齐实体的变换矩阵
  36. ;;输入:ent - 实体名
  37. ;;输出:平齐这个实体的变换矩阵和它的逆矩阵
  38. (defun mat:entitymatrix (ent / z dxf cen obj an m1 mat inv org)
  39.   (setq dxf (entget ent))
  40.   (if (setq cen (cdr (assoc 10 dxf)))
  41.     (if (null (caddr cen))
  42.       (setq cen (append cen '(0.0)))
  43.     )
  44.     (setq cen '(0 0 0))
  45.   )
  46.   (setq obj (vlax-ename->vla-object ent))
  47.   (if (and (vlax-property-available-p obj 'elevation)
  48.         (wcmatch (vla-get-objectname obj) "*Polyline")
  49.       )
  50.     (setq z (vla-get-elevation obj)
  51.       cen (list (car cen) (cadr cen) (+ (caddr cen) z))
  52.     )
  53.   )
  54.   (if (vlax-property-available-p obj 'rotation)
  55.     (setq an (vla-get-rotation obj))
  56.     (setq an 0)
  57.   )
  58.   (mat:trans1 0 ent cen an)
  59. )
  60. ;;通用变换矩阵 ------------
  61. ;;from - 原坐标系,to   - 目的坐标系
  62. ;;org  - 目的坐标系的原点相对原坐标系的位置
  63. ;;ang  - 相对于原坐标系的旋转角度
  64. ;;输出:两个矩阵,一个是从原坐标系变换到目的坐标系的变换矩阵 一个是从目的坐标系变换到原坐标系的变换矩阵
  65. (defun mat:trans1 (from to org ang / mat rot inv cen)
  66.   (setq mat (mapcar (function (lambda (v) (trans v from to t))) '((1. 0. 0.) (0. 1. 0.) (0. 0. 1.))))
  67.   (if (not (equal ang 0 1e-14))
  68.     (setq rot (list (list (cos ang) (- (sin ang)) 0.) (list (sin ang) (cos ang) 0.) (list 0. 0. 1.))
  69.       mat (mat:mxm mat rot)
  70.     )
  71.   )
  72.   (setq cen (trans org to from))
  73.   (setq inv (mat:trp mat))
  74.   (list
  75.     (mat:disptomatrix inv (mat:mxv inv (mapcar '- cen)))
  76.     (mat:disptomatrix mat cen)
  77.   )
  78. )
  79. ;;把位移矢量添加到矩阵中
  80. ;;输入:mat -- 矩阵(3x3),disp -- 位移矢量
  81. ;;输出:一个4x4的变换cad的标准变换矩阵
  82. (defun mat:disptomatrix  (mat disp)
  83.   (append
  84.     (mapcar 'append mat (mapcar 'list disp))
  85.     '((0. 0. 0. 1.))
  86.   )
  87. )
  88. ;;矩阵相乘
  89. (defun mat:mxm (m q)
  90.   (mapcar (function (lambda (r) (mat:mxv (mat:trp q) r))) m)
  91. )
  92. ;;矩阵转置
  93. ;;输入:矩阵
  94. ;;输出:转置后的矩阵
  95. (defun mat:trp (m)
  96.   (apply 'mapcar (cons 'list m))
  97. )
  98. ;;缩放矩阵----
  99. (defun mat:scaling (p0 scale / s)
  100.   (setq s (- 1 scale))
  101.   (list
  102.     (list scale 0. 0. (* s (car p0)))
  103.     (list 0. scale 0. (* s (cadr p0)))
  104.     (list 0. 0. scale (* s (caddr p0)))
  105.     '(0. 0. 0. 1.)
  106.   )
  107. )
  108. ;;旋转矩阵----
  109. (defun mat:rotation (p0 ang / c s x y)
  110.   (setq c (cos ang) s (sin ang))
  111.   (setq x (car p0) y (cadr p0))
  112.   (list
  113.     (list c (- s) 0. (- x (- (* c x) (* s y))))
  114.     (list s    c  0. (- y (+ (* s x) (* c y))))
  115.     '(0. 0. 1. 0.)
  116.     '(0. 0. 0. 1.)
  117.   )
  118. )
  119. ;平移变换矩阵v 位移矢量---(一级)---
  120. (defun mat:translation (v)
  121.   (list
  122.     (list 1. 0. 0. (car v))
  123.     (list 0. 1. 0. (cadr v))
  124.     (list 0. 0. 1. (caddr v))
  125.     (list 0. 0. 0. 1.)
  126.   )
  127. )
  128. ;平移变换矩阵---(一级)---
  129. ;p1基点 p2目标点
  130. (defun mat:translateby2p (p1 p2 / mat)
  131.   (if (and p1 p2 (is_pt p1) (is_pt p2) (> (distance p1 p2) 0.01))
  132.     (setq mat (mat:translation (mapcar '- p2 p1)))
  133.   )
  134.   mat
  135. )
  136. ;;二维镜像变换矩阵
  137. ;;p1 镜像向量第一点 p2 镜像向量第二点
  138. (defun mat:reflect (p1 p2 / a c s x y)
  139.   (setq a (angle p1 p2) a (+ a a))
  140.   (setq c (cos a) s (sin a))
  141.   (setq x (car p1) y (cadr p1))
  142.   (list
  143.     (list c s  0. (- x (+ (* c x) (* s y))))
  144.     (list s (- c) 0. (- y (- (* s x) (* c y))))
  145.     '(0. 0. 1. 0.)
  146.     '(0. 0. 0. 1.)
  147.   )
  148. )
  149. ;平移+旋转变换矩阵---(一级)---
  150. ;p1 基点 p2 目标点 并旋转ang(nil 仅平移)度
  151. ;(mat:translateby2pang p1 p2 nil) 平移
  152. ;(mat:translateby2pang p1 p1 ang) 旋转
  153. ;(mat:translateby2pang p1 p2 ang) 平移+旋转
  154. (defun mat:translateby2pang (p1 p2 ang / q mat)
  155.   (setq mat (mat:translateby2p p1 p2))
  156.   (if ang
  157.     (progn
  158.       (cond
  159.         ((and p1 (is_pt p1))
  160.           (setq q (mat:rotation (trans p1 1 0) ang))
  161.         )
  162.         ((and p2 (is_pt p2))
  163.           (setq q (mat:rotation (trans p2 1 0) ang))
  164.         )
  165.       )
  166.       (setq mat (mat:mxm mat q)) ;转动矩阵;矩阵相乘:移动+转动
  167.     )
  168.   )  
  169.   mat  
  170. )
  171. ;平移+缩放变换矩阵---(一级)---
  172. ;p1 基点 p2 目标点 并缩放sc倍(nil 仅平移)度
  173. ;(mat:translateby2psc p1 p2 nil) 平移
  174. ;(mat:translateby2psc p1 p1 sc) 旋转
  175. ;(mat:translateby2psc p1 p2 sc) 平移+旋转
  176. (defun mat:translateby2psc (p1 p2 sc / q mat)
  177.   (setq mat (mat:translateby2p p1 p2))
  178.   (if sc
  179.     (progn
  180.       (cond
  181.         ((and p1 (is_pt p1))
  182.           (setq q (mat:scaling (trans p1 1 0) sc))
  183.         )
  184.         ((and p2 (is_pt p2))
  185.           (setq q (mat:scaling (trans p2 1 0) sc))
  186.         )
  187.       )
  188.       (setq mat (mat:mxm mat q)) ;缩放矩阵;矩阵相乘:移动+缩放
  189.     )
  190.   )  
  191.   mat  
  192. )
  193. ;选择集!!矩阵变换!!-----(一级)----
  194. ;返回变换后本集
  195. (defun sl:sstransformby (mat ss / i e)
  196.   (setq mat (vlax-tmatrix mat))
  197.   (setq i -1)
  198.   (while (setq e (ssname ss (setq i (1+ i))))
  199.     (vla-transformby (vlax-ename->vla-object e) mat)
  200.   )
  201.   ss
  202. )
  203. ;选择集ss 以基点p0 旋转ang(弧度)---(一级)-----
  204. ;(sl-rot (ssget) (getpoint) (* pi 0.25))
  205. ;;返回变换后选择集
  206. (defun sl-ssrot (ss p0 ang / mat)
  207.   (setq mat (mat:rotation (trans p0 1 0) ang))
  208.   (sl:sstransformby mat ss)
  209.   (setq ss (sl-wzgz ss)) ;文字归正
  210.   ss
  211. )
  212. ;;实体,选择集,实体表->矩阵从p1到p2移动并旋转ang度-----(一级)------
  213. (defun sl:mov-ang (ss p1 p2 ang / mat)
  214.   (if (setq mat (mat:translateby2pang p1 p2 ang))
  215.     (cond
  216.       ((= (type ss) 'ENAME) (vla-transformby (vlax-ename->vla-object ss) (vlax-tmatrix mat))) ;图元
  217.       ((= (type ss) 'PICKSET) (sl:sstransformby mat ss)) ;集
  218.       ((= (type ss) 'LIST) (sl:sstransformby mat (sl:pickset-fromlist ss))) ;实体表
  219.     )
  220.   )
  221.   (if ang (setq ss (sl-wzgz ss)));文字归正
  222.   ss
  223. )
  224. ;;实体,选择集,实体表->矩阵从p1到p2移动并缩放sc倍-----(一级)------
  225. (defun sl:mov-sc (ss p1 p2 sc / mat)
  226.   (if (setq mat (mat:translateby2psc p1 p2 sc))
  227.     (cond
  228.       ((= (type ss) 'ENAME) (vla-transformby (vlax-ename->vla-object ss) (vlax-tmatrix mat))) ;图元
  229.       ((= (type ss) 'PICKSET) (sl:sstransformby mat ss)) ;集
  230.       ((= (type ss) 'LIST) (sl:sstransformby mat (sl:pickset-fromlist ss))) ;实体表
  231.     )
  232.   )
  233. )
  234. ;;实体,选择集,实体表->矩阵以p1到p2为轴镜像-----(一级)------
  235. ;;返回处理后本集
  236. (defun sl:mir (ss p1 p2 / mat s)
  237.   (if ss
  238.     (progn
  239.       (setq mat (mat:reflect p1 p2))
  240.       (cond
  241.         ((= (type ss) 'PICKSET) (sl:sstransformby mat ss)) ;集
  242.         ((= (type ss) 'ENAME) (vla-transformby (vlax-ename->vla-object ss) (vlax-tmatrix mat))) ;图元
  243.         ((= (type ss) 'LIST) (sl:sstransformby mat (sl:pickset-fromlist ss))) ;实体表
  244.       )
  245.       (setq s (sl-wzgz ss));文字归正
  246.     )
  247.   )
  248.   s
  249. )
  250. ;实体,选择集,实体表->缩放---(一级)---
  251. (defun sl:scale (ss p0 sc)
  252.   (if (not p0) (setq p0 (e-mid ss)))
  253.   (sl:mov-sc ss p0 p0 sc)
  254. )
  255. ;实体,选择集,实体表->移动---(一级)---
  256. (defun sl:move (ss p1 p2)
  257.   (sl:mov-ang ss p1 p2 nil)
  258. )
  259. ;;三领矩阵---------[结束]-----------

本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
tranque + 1 很给力!

查看全部评分

回复

使用道具 举报

发表于 昨天 14:36 | 显示全部楼层
老陈厉害了,数学函数还是非常必要的。
回复 支持 反对

使用道具 举报

发表于 昨天 14:39 | 显示全部楼层
别人的函数,他拿来用的

点评

部分是高飞,我加工的,改的,完善的,我自己写的使用部分函数。  发表于 昨天 16:46
回复 支持 反对

使用道具 举报

发表于 昨天 15:42 | 显示全部楼层
本帖最后由 自贡黄明儒 于 2025-4-29 15:43 编辑
烟盒迷唇 发表于 2025-4-29 14:39
别人的函数,他拿来用的

嗯,可以写明出处,像是highflybird大师写的
回复 支持 反对

使用道具 举报

发表于 昨天 16:32 | 显示全部楼层
自贡黄明儒 发表于 2025-4-29 15:42
嗯,可以写明出处,像是highflybird大师写的

三领可能觉得英雄不问出处

但,这是英雄的作品。

点评

一个个对一对看一看,那些是原样的,那些是修改的,那些是增加的。怎么达到方便调用的集成。  发表于 昨天 17:28
回复 支持 反对

使用道具 举报

发表于 昨天 17:44 | 显示全部楼层
谢谢分享      
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-30 10:36 , Processed in 0.166346 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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