明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 620|回复: 7

[源码] 关于矩阵的探索之路

[复制链接]
发表于 2024-12-19 18:09:59 | 显示全部楼层 |阅读模式
本帖最后由 尘缘一生 于 2024-12-19 18:34 编辑

闲来无事,看到本坛的说,COMMAND  MOVE   ROTATE
过往啊,我也尝试,探讨许多次,
总觉得,还是COMMAND的快,并不慢,到底怎么快,拿不准主意
鉴于矩阵的话,比较晦涩难懂,弄一段时间,放弃了,
所以啊,高飞大师这种数学好的,是基础科学,好比华为任正非讲的:“俄罗斯科学家那个故事....”
闲也无聊呢,弄几个函数,测试还是不快呢!
难道移动,旋转最快的方式我们找不到吗?特别是和GRREAD整合做起来,频繁刷新时候,能不卡的。
非得C ARX VB去写吗? 可惜我早已忘记C++20几年了,拾不起来!
  1. ;实体,选择集,实体表->矩阵移动---(一级)---
  2. (defun sl:move (ss p1 p2)
  3.   (sl:mov-ang ss p1 p2 nil)
  4. )
  5. ;选择集ss以基点p0 旋转ang(弧度)---(一级)-----
  6. ;(sl-rot (ssget) (getpoint) (* pi 0.25))
  7. (defun sl-ssrot (ss p0 ang / mat)
  8.   (setq mat (mat:rotation (trans p0 1 0) ang))
  9.   (sl:sstransformby mat ss)
  10.   (sl-wzgz ss)
  11.   (princ)
  12. )
  13. ;;实体,选择集,实体表->矩阵从p1到p2移动并旋转ang度-----(一级)------
  14. (defun sl:mov-ang (ss p1 p2 ang / mat)
  15.   (if (setq mat (mat:translateby2pang p1 p2 ang))
  16.     (cond
  17.       ((= (type ss) 'ENAME) (vla-transformby (vlax-ename->vla-object ss) (vlax-tmatrix mat))) ;图元
  18.       ((= (type ss) 'PICKSET) (sl:sstransformby mat ss)) ;集
  19.       ((= (type ss) 'LIST) (sl:sstransformby mat (sl:pickset-fromlist ss))) ;实体表
  20.     )
  21.   )
  22. )
  23. ;平移+旋转变换矩阵---(一级)---
  24. ;p1 基点 p2 目标点 并旋转ang(nil 仅平移)度
  25. ;(mat:translateby2pang p1 p2 nil) 平移
  26. ;(mat:translateby2pang p1 p1 ang) 旋转
  27. ;(mat:translateby2pang p1 p2 ang) 平移+旋转
  28. (defun mat:translateby2pang (p1 p2 ang / q mat)
  29.   (setq mat (mat:translateby2p p1 p2))
  30.   (if ang
  31.     (if mat
  32.       (setq q (mat:rotation (trans p1 1 0) ang) mat (mat:mxm mat q)) ;转动矩阵;矩阵相乘:移动+转动
  33.       (cond
  34.         ((and p1 (is_pt p1))
  35.           (setq mat (mat:rotation (trans p1 1 0) ang))
  36.         )
  37.         ((and p2 (is_pt p2))
  38.           (setq mat (mat:rotation (trans p2 1 0) ang))
  39.         )
  40.       )
  41.     )
  42.   )  
  43.   mat  
  44. )
  45. ;选择集矩阵变换---(一级)---
  46. (defun sl:sstransformby (mat ss / i e)
  47.   (setq mat (vlax-tmatrix mat))
  48.   (setq i -1)
  49.   (while (setq e (ssname ss (setq i (1+ i))))
  50.     (vla-transformby (vlax-ename->vla-object e) mat)
  51.   )
  52. )
  53. ;平移变换矩阵---(一级)---
  54. ;p1基点 p2目标点
  55. (defun mat:translateby2p (p1 p2 / mat)
  56.   (if (and p1 p2 (is_pt p1) (is_pt p2) (> (distance p1 p2) 0.01))
  57.     (setq mat (mat:translation (mapcar '- p2 p1)))
  58.   )
  59.   mat
  60. )
  61. ;平移变换矩阵v 位移矢量---(一级)---
  62. (defun mat:translation (v)
  63.   (list
  64.     (list 1. 0. 0. (car v))
  65.     (list 0. 1. 0. (cadr v))
  66.     (list 0. 0. 1. (caddr v))
  67.     (list 0. 0. 0. 1.)
  68.   )
  69. )

这一切,只不过是想弄掉几个command代码罢了,举例三领函数之一;然而,效率不行,矩阵再高级,也绝不可入三领集成的。
  1. ;SLdesign 三领  by 尘缘一生  QQ 15290049
  2. ;;移动-拷贝-旋转-镜像-递增-放缩------(一级)---------
  3. ;;ss:实体、实体表、选择集 p0 移动起点 nil | k: t(move) nil(copy)
  4. (defun sldomov (ss p0 k / e_lst p1 p2 p3 pt pt1 loop ang dis f3 f8 bb p00 a a0 b e1 ee kk px py xx dqxx mk str)
  5.   (setq e_lst (sysvar '("QAFLAGS" "CMDECHO" "NOMUTT" "OSMODE" "ORTHOMODE")) p1 (cadr (grread 5)))
  6.   (cond
  7.     ((= (type ss) 'ENAME) (setq ss (ssadd ss))) ;图元
  8.     ((= (type ss) 'LIST) (setq ss (sl:pickset-fromlist ss))) ;实体表
  9.   )
  10.   (command "_.undo" "be") ;;舍弃高级代码,加速
  11.   (setvar "CMDECHO" 0) ;;命令显示关闭
  12.   (setvar "NOMUTT" 1)
  13.   (setvar "QAFLAGS" 0)
  14.   (if (= p0 nil)
  15.     (setq p0 (ssmpt ss))
  16.     (setq p0 (polar p1 (angle p1 p0) (distance p1 p0)))
  17.   )
  18.   (princ
  19.     (setq str
  20.       (slmsg
  21.         "\n->[逆转90度(TAB)/取角(A)/LIN.(E)/<-mir->(D)/↑mir ↓(S)/mir-F(4)/放大(Q)/缩小(W)/递增(Z)/递减(J)/大一倍(+)/小一半(-)/复制当前(C)/基点(X)/正交(F8)/扑捉(F3)](空格..复制)(左键>当前)(右键>退出)"
  22.         "\n->[癴锣90(TAB)/à(A)/LIN.(E)/<-mir->(D)/◆mir □(S)/mir-F(4)/(Q)/罽(W)/患糤(Z)/患搭(J)/(+)/(-)/確讽玡(C)/膀翴(X)/タユ(F8)/汲(F3)](..確)(オ龄>讽玡)(/龄>癶)"
  23.         "\n->[Rever90(TAB)/Takang(A)/LIN.(E)/<-mir->(D)/↑mir ↓(S)/mir-F(4)/Zoom1.1(Q)/Zoom0.9(W)/Increase(Z)/Decrease(J)/Zoom2.0(+)/Zoom0.5(-)/Copy current(C)/Base point(X)/Orth(F8)/Osnap(F3)]Spaced..Copy/Right>Exit"
  24.       )
  25.     )
  26.   )
  27.   (setq loop t pt1 p0 p2 p0 f8 (getvar "ORTHOMODE") f3 (getvar "OSMODE") dqxx 1)
  28.   (while loop
  29.     (setq bb (grread t 15 2) p00 (cadr bb))
  30.     (cond
  31.       ((equal bb '(2 6));F3切换捕捉开关
  32.         (cond
  33.           ((and (< f3 16384) (/= f3 0))
  34.             (setq f3 (+ f3 16384))
  35.             (prompt (slmsg "\n <对象捕捉 关>" "\n <癸禜 闽>" "\n <OSnap Off>"))
  36.           )
  37.           ((or (= f3 0) (>= f3 16384))
  38.             (setq f3 16383)
  39.             (prompt (slmsg "\n <对象捕捉 开>" "\n <癸禜 秨>" "\n <OSnap On>"))
  40.           )
  41.         )
  42.         (setvar "OSMODE" f3) (redraw)
  43.       )   
  44.       ((equal bb '(2 15))    ;F8切换正交开关
  45.         (if (= f8 0)
  46.           (progn (setq f8 1) (prompt (slmsg "\n <正交 开>" "\n <タユ 秨>" "\n <Orth open>")))
  47.           (progn (setq f8 0) (prompt (slmsg "\n <正交 关>" "\n <タユ 闽>" "\n <Orth off>")))
  48.         )
  49.         (setvar "ORTHOMODE" f8) (redraw)
  50.       )
  51.       ((= (car bb) 5)
  52.         (redraw)
  53.         (if (= f8 1)
  54.           (progn
  55.             (setq ang (angle p2 p00))
  56.             (cond
  57.               ((or (and (> ang pi4) (< ang 3pi4)) (and (> ang 5pi4) (< ang 7pi4)))
  58.                 (setq pt (list (car p2) (cadr p00)))
  59.               )
  60.               (t
  61.                 (setq pt (list (car p00) (cadr p2)))
  62.               )
  63.             )
  64.           )
  65.           (setq pt p00)
  66.         )
  67.         (if (and (<= f3 16384) (> f3 0) (/= f8 1))
  68.           (setq pt (slosnappt ss pt) kk t)
  69.         )
  70.         (if (and (not mk) (> (distance p0 pt) 0.001))
  71.           (command "move" ss "" "_non" p0 "_non" pt)
  72.         )  
  73.         (setq p0 pt)
  74.       )
  75.       ((equal bb '(2 52))  ;; 4mir
  76.         (if mk (setq mk nil) (setq mk t p3 nil a0 nil))
  77.       )
  78.       ((member bb '((2 9)))      ;;table 键
  79.         (command "ROTATE" ss "" "_non" pt 90)
  80.         (setq ss (sl-wzgz ss))
  81.       )
  82.       ((member bb '((2 65) (2 97)))   ;;A 旋转定角
  83.         (ss-rotang ss 0) ;选择集先转0度水平
  84.         (setq a (ss9pt ss 1))
  85.         (setq b (polar a 0 500))
  86.         (command ".rotate" ss "" "_non" a "r" "_non" a "_non" (polar pt (angle pt b) (distance pt b)) pause)
  87.         (setq ss (sl-wzgz ss))
  88.       )
  89.       ((member bb '((2 115) (2 83)))  ;;S s 上下翻
  90.         (command "mirror" ss "" "_non" pt "_non" (mapcar '- pt '(1 0)) "Y")
  91.       )
  92.       ((member bb '((2 100) (2 68))) ;;D d 左右翻
  93.         (command "mirror" ss "" "_non" pt "_non" (mapcar '- pt '(0 1)) "Y")
  94.       )
  95.       ((or (member bb '((2 13))) (= (car bb) 3));;左键、回车
  96.         (setq mk nil)
  97.         (if (= k t) ;;移动
  98.           (setq loop nil)
  99.           (progn
  100.             (command "copy" ss "" "_non" '(0 0) "_non" '(0 0))
  101.             (setq ang (angle pt1 pt) dis (distance pt1 pt) pt1 pt)
  102.           )
  103.         )
  104.       )
  105.       ((member bb '((2 69) (2 101)))   ;;E e 齐线
  106.         (princ (slmsg "\n 请选择要对齐的(线或实体)-->" "\n 叫匡拒璶癸霍(絬┪龟砰)-->" "\n Please select the (line or entity) to align -->"))
  107.         (setq ss (ss-rotang ss 0))
  108.         (setq e1 (car (setq ee (entsel ))))
  109.         (setq ang (e-ang e1 (cadr ee)))
  110.         (setq ss (ss-rotang ss ang))
  111.         (setq ss (sl-wzgz ss))
  112.         (princ str)
  113.       )
  114.       ((member bb '((2 67) (2 99)))   ;;C c 复制在当前
  115.         (command "copy" ss "" "_non" '(0 0) "_non" '(0 0))
  116.         (setq ang (angle pt1 pt) dis (distance pt1 pt) pt1 pt)
  117.       )
  118.       ((and (member bb '((2 32))) ang dis) ;;空格键
  119.         (command "copy" ss "" "_non" '(0 0) "_non" '(0 0))
  120.         (command "MOVE" ss "" "_non" pt1 "_non" (setq pt1 (polar pt1 ang dis))) ;;移位
  121.       )
  122.       ((member bb '((2 87) (2 119)))         ;;缩小  W w
  123.         (command "scale" ss "" "_non" pt "0.9")
  124.       )
  125.       ((member bb '((2 81) (2 113)))         ;;放大  Q q
  126.         (command "scale" ss "" "_non" pt "1.1")
  127.       )
  128.       ((equal bb '(2 45))         ;;缩小一半 -
  129.         (command "scale" ss "" "_non" pt "0.5")
  130.       )
  131.       ((member bb '((2 43) (2 61))) ;;放大一倍 +
  132.         (command "scale" ss "" "_non" pt "2.0")
  133.       )
  134.       ((member bb '((2 90) (2 122)))  ;;递增 Z z
  135.         (setq ss (ss++ ss 1))
  136.       )
  137.       ((member bb '((2 74) (2 106)))  ;;递减 J j
  138.         (setq ss (ss++ ss -1))
  139.       )
  140.       ((member bb '((2 88) (2 120)))  ;;基点 X x
  141.         (command "MOVE" ss "" "_non" pt "_non" p0)  ;;移回去
  142.         (princ (slmsg "\n 指定基点-->" "\n ﹚膀翴-->" "\n Specify Base Point -->"))
  143.         (slslx p0 0)
  144.         (setvar "OSMODE" 16383)
  145.         (setq p1 (getpoint p0))
  146.         (command "MOVE" ss "" "_non" p1 "_non" p0)
  147.         (setvar "OSMODE" f3)
  148.         (princ str)
  149.       )
  150.       ((member (car bb) '(11 25));;右键
  151.         (if (= k t) ;;移动
  152.           (command "MOVE" ss "" "_non" pt "_non" p0)  ;;移回去
  153.           (sl:erase ss)
  154.         )
  155.         (setq loop nil mk nil)
  156.       )
  157.     )
  158.     (if mk
  159.       (progn
  160.         (if (or (not p3) (not a0)) (setq a (ss9pt ss nil) p3 (nth 5 a) a0 (angle (car a) (caddr a))))
  161.         (setq xx (sl-4p p3 p0) px (polar p3 a0 50) py (polar p3 (+ a0 pi2) 50))
  162.         (if (/= dqxx xx)
  163.           (cond
  164.             ((or (= dqxx 1) (= dqxx 4))
  165.               (if (or (= xx 2) (= xx 3)) (command "mirror" ss "" "_non" p3 "_non" py "y"))
  166.               (if (and (/= xx 2) (/= xx 3)) (command "mirror" ss "" "_non" p3 "_non" px "y"))
  167.             )
  168.             ((or (= dqxx 2) (= dqxx 3))
  169.               (if (or (= xx 1) (= xx 4)) (command "mirror" ss "" "_non" p3 "_non" py "y"))
  170.               (if (and (/= xx 1) (/= xx 4)) (command "mirror" ss "" "_non" p3 "_non" px "y"))
  171.             )
  172.           )
  173.         )
  174.         (setq dqxx xx)
  175.       )
  176.     )
  177.   );while
  178.   (redraw)
  179.   (if kk (sl:erase (ssget "X" (list (cons 8 "f-i-n-d")))))
  180.   (command "_.undo" "e")
  181.   (mapcar 'eval e_lst)
  182.   (princ)
  183. )
以上函数,我还是采用了COMMAND多,总觉得,还有未知之路,还有永不止境的完善空间......

本帖子中包含更多资源

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

x

评分

参与人数 2明经币 +2 收起 理由
tranque + 1 赞一个!
yanshengjiang + 1

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
回复

使用道具 举报

发表于 2024-12-19 18:23:49 | 显示全部楼层
矩阵不难懂,难的是Lisp敲矩阵,
学之前你得知道数组吧,结果你不知道,
数组可以O(1)寻址,结果你不知道,
别人都是有C++经验来教你,
他是降为打击啊,说到降维,
如果连多维数组就是一维数组都不知道,那么就白学了,
一维数组只需要array[i*j+m]就是二维数组了,
这样矩阵求值只需要面对一维数组,而不需要考虑多维.
再加强一点,就是CPU预读和硬件加速了.
https://www.cnblogs.com/JJBox/p/14300098.html
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-19 18:28:38 | 显示全部楼层
本帖最后由 尘缘一生 于 2024-12-19 18:36 编辑
你有种再说一遍 发表于 2024-12-19 18:23
矩阵不难懂,难的是Lisp敲矩阵,
学之前你得知道数组吧,结果你不知道,
数组可以O(1)寻址,结果你不知道,

能不能提速,移动,旋转“大选择集”问题,顾版的哪个函数也是快不起来呢。
回复 支持 反对

使用道具 举报

发表于 2024-12-19 18:36:59 | 显示全部楼层
尘缘一生 发表于 2024-12-19 18:28
能不能提速,移动,旋转“大选择集”问题,顾版的函数也是快不起来呢。

你的这个问题并不用矩阵提速,
这个问题更多是Lisp访问图元之前会进行锁符号表,
这些权限工作会令你大规模操作时候发生瓶颈,
每个图元都锁一次表,和一次锁定再使用,速度就不一样了,
即使同样的代码,在C#敲一遍速度也完全不一样了,
所以想要提速还是要转变一下思维,
尤其是C#有并行,并发,等等许许多多操作.

点评

“并行”二字,我明白了。  发表于 2024-12-19 18:39
回复 支持 反对

使用道具 举报

发表于 2024-12-19 18:39:23 | 显示全部楼层
每天看会天书,嗯,总有一天会起飞的。
回复 支持 反对

使用道具 举报

发表于 2024-12-20 09:39:41 | 显示全部楼层
lsp  不适用于追求速度这种,它的特点灵活简单好用,大家学习高级算法,只是便于理解各种底层逻辑。高飞鸟大佬,人家其实玩的是c++  ,学习矩阵是必须过程
回复 支持 反对

使用道具 举报

发表于 2024-12-21 09:35:56 | 显示全部楼层
飞诗的提示

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-22 21:48 , Processed in 0.192157 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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