大家都知道,在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的基本变换命令等等。(一步比一步更简单),在此过程中我希望能听听大家的看法和建议。
|