找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2937|回复: 12

[飞鸟集] 如何像photoshop那样---CAD中的平面几何变换及其矩阵

[复制链接]

已领礼包: 8121个

财富等级: 富甲天下

发表于 2013-5-7 01:38:40 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 Highflybird 于 2013-5-7 01:53 编辑

大家都知道,在photoshop 中,对图像的某部分如果要实施变换,是很方便的,按下ctrl+T 之后,就会一个矩形外框,对矩形外框变换时,也对图像实施了变换。Photoshop是光栅格式的图,Coreldraw 等之类的矢量编辑软件,同样也有相似的功能。
在CAD中要完成这样的变换,可能需要几个步骤。而且对于圆,椭圆之类的想要实现其准确的错切变换,就很困难。今天我完成了这样的一个lisp程序,放在这里与大家讨论一下。
先简单介绍一下仿射变换。
仿射变换是一种线性变换,其变换方程为: X=a11*x+b11*y+c11,Y=a12*x+b12*y+c12
包括了我们平常说的正交变换,旋转,缩放,不等比缩放,错切变换,镜像变换等等。
这是一种线性变换群,其中有很多不变量。例如: 1,平行性保持不变,2,同素性。3,简比,4,结合性等等。二次曲线变换也有不变量:椭圆变换之后仍然是椭圆,如此等等。
因为CAD执行的是矢量数据,对线或曲线实施了变换后,实际是对其方程的变换,不是对像素的变换,因而必须了解其变换后的方程式。现先看看变换矩阵:
((a 0 0) (0 b 0) (0 0 1))是比例变换;((1 0 0) (0 1 0) (0 0 s))是等比变换
((1 0 0) (c 1 0) (0 0 1))是沿x错切变换,((1 b 0) (0 1 0) (0 0 1))是沿Y错切变换
((cos(a) sin(a) 0) (-sin(a) cos(a) 0) (0 0 1))是旋转变换。
((1 0 0)(0 1 0)(g h 1))是平移变换
可以把这个矩阵推广到4X4阶的变换,(包括了透视变换)我不在此赘述。
开始的时候我想的简单以为用vla-transformby就可以实现了,却不知这个函数实现的变换很有限,连不等比变换都实现不了,那就有点形同虚设了。为此,我参阅了一些书籍,这些日子断断续续地完成了第一步,也是很关键的一步。那就是基本能实现了仿射变换,(主要对错切变换较为有用),从理论上来说,这个变换能实现基本所有的几何变换,但那样可能比较麻烦。
然后我加载了一个反应器( 很多代码来源于lisp的教程-----gp: path)
用法如下: 加载程序(两个都要加载 reactor5.lsp, transXY.lsp)后,运行test
如果不用反应器,就用t1命令





选中物体之后,出现包围物体的外框,当对这个外框的夹点拉伸,就能实施仿射变换(例如错切变换),对这个外框实行其他CAD命令,如move等命令时候,反应器将不再与这个外框联系,当删除外框后,反应器也将移除。
代码较长,故未贴出,在附件中,我也不会搞演示,所以只能看提示了。
这个代码还很不完善,正在向下一步目标迈进: 把反应器链接到不等比变换中去,再接下来就是平移变换。再就是链接到CAD的基本变换命令等等。(一步比一步更简单),在此过程中我希望能听听大家的看法和建议。


trans1.jpg


trans2.jpg


请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:trans.rar 
下载次数:67  文件大小:11.9 KB 
下载权限: 不限 以上  [免费赚D豆]



评分

参与人数 2D豆 +10 贡献 +1 收起 理由
ll_j + 5 好主题奖!
炫翔 + 5 + 1 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

已领礼包: 8121个

财富等级: 富甲天下

 楼主| 发表于 2013-5-7 01:42:28 | 显示全部楼层

今天再次完成了对物体的X,Y方向任意比例(可以为负值,但不能为零)变形。
用法 :加载lisp,运行test
选中物体之后,出现包围物体的外框,当对这个外框的夹点拉伸,就能实施比例变换(包括不等比变换),对这个外框实行其他CAD命令,如move等命令时候,反应器将不再与这个外框联系,当删除外框后,反应器也将移除。


trans3.jpg


trans4.jpg


接下来的工作便是加对话框,把两个变换融合到一起,使之变成一个完整的程序。
其实关于这个程序,里面包含的一些程序也是常用的,例如:
1、求包围物体的最大外框
2、求物体的错切变换
3、求物体的不等比变换
4、对反应器的用法。
5、建立选择集的匿名块。
还有一些来源于教程gp:path--花园小路(一篇很不错的lisp教程)中的一些代码,有些适用的程序,如极小数视为零,点表转化为activeX方式的列表,等等。


请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:REACTOR-scale.lsp 
下载次数:47  文件大小:12.4 KB 
下载权限: 不限 以上  [免费赚D豆]




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

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

 楼主| 发表于 2013-5-7 01:48:39 | 显示全部楼层
本帖最后由 Highflybird 于 2013-5-7 01:52 编辑

第一个程序是关于错切变换的,reactor-shift.lsp,带反应器;
第二个程序是不带反应器的错切变换,transXY.lsp;
第三个程序是关于比例变换的,reactor-scale.lsp,带反应器;
任意形状的比例变换已经实现,但任意形状的错切变换还没完全实现,现在实行错切变换的物体有:
polyline,arc,circle,ellipse,line,point,应付一般问题已经足够。下一步的目标是实现对物体spline,text,dim,block等等也能仿射变换。现在遇到的困难是spline样条曲线的方程我不知道,查阅了书籍和网站,依然不得其法。
最终要加入菜单或者对话框以供选择(这还比较好办),以及实现射影变换(透视变换)。希望大家能提供思路或者资料给我,谢谢!

另外我感觉可能有一种比较普遍的方法,能够对付CAD所有类型,(因为是仿射变化,应该与UCS 用户坐标系有关,但是一下子还没有想出来). 下面是加了反映器后文字变换的效果:



transtext.jpg

byghbcx朋友对text,solid,spline进行仿射变换.对mtext没能转换.spline参照pline的变换.


请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:tmp.lsp 
下载次数:41  文件大小:2.04 KB 
下载权限: 不限 以上  [免费赚D豆]


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

使用道具 举报

已领礼包: 188个

财富等级: 日进斗金

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

使用道具 举报

发表于 2013-5-7 09:03:22 | 显示全部楼层
对于 Spline 的变换是不是可以通过变换其控制点的变换,剩下的工作让CAD完成?

点评

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

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-5-7 09:28:12 | 显示全部楼层
本帖最后由 牢固 于 2013-5-7 09:30 编辑

真是好贴!
正好我最近也在写一个任意实体矩阵转换的函数(Gxl-TransformBy TARGET MAT),以替代vla-transformby函数,以弥补vla-transformby只能进行等比转换的缺点,因目前手头有点忙,一直没完成,目前只完成了line/*polyline/arc/circle/ellipse/insert等实体的变换,其他实体还没来得及弄!
对于实体的矩阵转换,谈几点我的看法:
1、对于包含圆弧段的Polyline,转换后,Polyline就不存在了,因为圆弧段转换后是椭圆,高飞鸟的转换没有对圆弧段进行处理,CAD的包含圆弧段的多段线的非等比图块,炸开后也是这样处理的!
2、对于Mtext的变换,只能将其转换为Text来进行变换,CAD的块中Mtext也是这样处理的!
3、对于Spline的变换,通过曲线方程来变,好像很困难!简单化处理,只能对节点组码10和11进行变换,不知道这样做是否正确,没有进行验证,这个可以通过将Spline加进块中,插入到图形中来进行验证!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

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

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-5-7 10:09:53 | 显示全部楼层
Free-Lancer 发表于 2013-5-7 09:03
对于 Spline 的变换是不是可以通过变换其控制点的变换,剩下的工作让CAD完成?

经验证,将Spline的组码表中11值全部移除,然后只将控制点10值进行变换,变换后的图形是正确的,但是变换后的Spline的拟合点就没有了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

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

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

 楼主| 发表于 2013-5-7 10:12:48 | 显示全部楼层
本帖最后由 Highflybird 于 2013-5-7 10:19 编辑

剩下来的变换就是 尺寸标注 和文字的变换,其实这两个的变换主要是算倾斜角度。
还有就是填充的变换,至于其他的,譬如表格之类的高版本的东西,也不是很难了。
看来可以完全实现仿射变换。
不过对于透视变换来说,就不那么容易了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6468个

财富等级: 富甲天下

发表于 2013-5-7 11:23:07 | 显示全部楼层
做个记号,以后再来学习,现在看不懂。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1402个

财富等级: 财源广进

发表于 2016-9-26 16:29:40 | 显示全部楼层
任意形状的错切变换没见有下文,不知道高飞鸟兄完成得怎么样?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 828个

财富等级: 财运亨通

发表于 2016-12-17 00:19:13 来自手机 | 显示全部楼层
今天才看到这样的好帖,实在太可惜了,顶起来
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 15:22 , Processed in 0.496410 second(s), 63 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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