找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 981|回复: 5

[求助] 怎么用矩阵实现拉伸旋转功能

[复制链接]

已领礼包: 862个

财富等级: 财运亨通

发表于 2016-12-7 13:49:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
用Highflybird的矩阵函数能实现放大旋转,谁能帮忙改一下或给个思路实现拉伸旋转的效果:
  1. (defun c:tt (/ ss p1 p2 mat1 mat2 mat3 i e o)
  2.   (if (setq ss (ssget))                                         ;选择物体
  3.     (progn
  4.       (initget 1)
  5.       (setq P1 (getpoint "n基点:"))                            ;指定基点
  6.       (initget 1)
  7.       (setq P2 (getpoint P1 "n目标点:"))                       ;指定目标点
  8.       (grvecs (list 1 p1 p2))                                   ;红线标识位移
  9.       (setq p1 (trans p1 1 0))                                  ;把输入得到的点转化为世界坐标系的点
  10.       (setq p2 (trans p2 1 0))                                  ;把输入得到的点转化为世界坐标系的点
  11.       (setq mat3 (MAT:SCALING p1 2.0))                          ;以P1为基点放大2倍变换矩阵
  12.       (setq mat2 (MAT:ROTATION p1 (* pi 0.25)))                 ;以P1为基点旋转45度的变换矩阵
  13.       (setq mat  (MAT:mxm mat2 mat3))                           ;须按照先后顺序从里到外这样相乘
  14.       (setq mat  (vlax-tmatrix mat))                           
  15.       (command "undo" "be")
  16.       (setq i 0)
  17.       (repeat (sslength ss)
  18.         (setq e (ssname ss i))                                  ;获得图元名
  19.         (setq o (vlax-ename->vla-object e))                     ;获得ActiveX对象
  20.         (vla-transformby o mat)                                 ;用vla-transformby函数对之变换
  21.         (setq i (1+ i))
  22.       )
  23.       (command "undo" "e")
  24.     )
  25.   )
  26.   (princ)
  27. )
  28. (defun MAT:TranslateBy2P ( p1 p2 )
  29.   (MAT:Translation (mapcar '- p2 p1))
  30. )
  31. (defun MAT:Translation ( v )
  32.   (list
  33.     (list 1. 0. 0. (car v))
  34.     (list 0. 1. 0. (cadr v))
  35.     (list 0. 0. 1. (caddr v))
  36.     (list 0. 0. 0. 1.)
  37.   )
  38. )
  39. (defun MAT:Rotation ( Cen ang / c s x y)
  40.   (setq c (cos ang) s (sin ang))
  41.   (setq x (car Cen) y (cadr Cen))
  42.   (list
  43.     (list c (- s) 0. (- x (- (* c x) (* s y))))
  44.     (list s    c  0. (- y (+ (* s x) (* c y))))
  45.     '(0. 0. 1. 0.)
  46.     '(0. 0. 0. 1.)
  47.   )
  48. )
  49. (defun MAT:Scaling ( Cen scale / s)
  50.   (setq s (- 1 scale))
  51.   (list
  52.     (list scale 0. 0. (* s (car Cen)))
  53.     (list 0. scale 0. (* s (cadr Cen)))
  54.     (list 0. 0. scale (* s (caddr Cen)))
  55.     '(0. 0. 0. 1.)
  56.   )
  57. )
  58. ;;;-----------------------------------------------------------;;
  59. ;;; 矩阵相乘                                                  ;;
  60. ;;; MAT:mxm Multiply two matrices -Vladimir Nesterovsky-      ;;
  61. ;;;-----------------------------------------------------------;;
  62. (defun MAT:mxm (m q)
  63.   (mapcar (function (lambda (r) (MAT:mxv (MAT:trp q) r))) m)
  64. )
  65. ;;;-----------------------------------------------------------;;
  66. ;;; 向量或点的矩阵变换(向量乘矩阵)                            ;;
  67. ;;; Matrix x Vector - Vladimir Nesterovsky                    ;;
  68. ;;; Args: m - nxn matrix, v - vector in R^n                   ;;
  69. ;;;-----------------------------------------------------------;;
  70. (defun MAT:mxv (m v)
  71.   (mapcar (function (lambda (r) (apply '+ (mapcar '* r v)))) m)
  72. )
  73. ;;;-----------------------------------------------------------;;
  74. ;;; 矩阵转置                                                  ;;
  75. ;;; MAT:trp Transpose a matrix -Doug Wilson-                  ;;
  76. ;;; 输入:矩阵                                                ;;
  77. ;;; 输出:转置后的矩阵                                        ;;
  78. ;;;-----------------------------------------------------------;;
  79. (defun MAT:trp (m)
  80.   (apply 'mapcar (cons 'list m))
  81. )


矩阵拉伸.gif
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-12-7 16:38:22 | 显示全部楼层
旋转构造 旋转矩阵, 拉伸就不是矩阵的TRANSFORM了,是拉伸点。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2016-12-7 16:51:36 | 显示全部楼层
楼主,你这个图片 是 块 还是 多段线?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 862个

财富等级: 财运亨通

 楼主| 发表于 2016-12-7 18:01:16 | 显示全部楼层
是直线加圆弧
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-12-7 18:17:20 | 显示全部楼层

从你图片演示用窗口选顶点推断,这个不是矩阵变换, 是拉伸顶点,STRETCH操作。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2016-12-7 19:36:24 | 显示全部楼层

看图片,看描述,楼主说的这个应该不是矩阵,是拉伸点,用纯LISP的话,在GRREAD循环里面,改变多段线和弧线的顶点坐标即可

论坛以前帖子写过,用XDRX API的,道理一样。

http://bbs.xdcad.net/forum.php?m ... 08707&fromuid=1

增强拉伸-1.gif
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-27 14:22 , Processed in 0.181615 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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