图形几何变换

在绘图过程中,经常需要对图形进行平移、缩小、放大和旋转等操作。MATLAB提供了专门的函数来实现图形的几何变换。

几何变换的基本原理

旋转变换使对象绕x,y或z轴旋转,逆时针旋转时角度为正。如果旋转角度为θ,则下面的矩阵定义绕各轴的旋转。

\[\left[ \begin{matrix} 1 & 0 & 0 & 0 \\ 0 & \operatorname{cos}{{\theta}_{x}} & -\operatorname{sin}{{\theta}_{x}} & 0 \\ 0 & \operatorname{sin}{{\theta}_{x}} & \operatorname{cos}{{\theta}_{x}} & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} \operatorname{cos}{{\theta}_{y}} & 0 & \operatorname{sin}{{\theta}_{y}} & 0 \\ 0 & 1 & 0 & 0 \\ -\operatorname{sin}{{\theta}_{y}} & 0 & \operatorname{cos}{{\theta}_{y}} & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} \operatorname{cos}{{\theta}_{z}} & -\operatorname{sin}{{\theta}_{z}} & 0 & 0 \\ \operatorname{sin}{{\theta}_{z}} & \operatorname{cos}{{\theta}_{z}} & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right]\]

平移变换相对于当前位置移动对象,用距离tx,ty和tz指定平移。下面的矩阵显示了这些元素在变换矩阵中的位置。

\[\left[ \begin{matrix} 1 & 0 & 0 & {t}_{x} \\ 0 & 1 & 0 & {t}_{y} \\ 0 & 0 & 1 & {t}_{z} \\ 0 & 0 & 0 & 1 \end{matrix} \right]\]

缩放(比例)变换改变对象的大小,指定比例因子sx, sy和sz创建下面的矩阵:

\[\left[ \begin{matrix} {S}_{x} & 0 & 0 & 0 \\ 0 & {S}_{y} & 0 & 0 \\ 0 & 0 & {S}_{z} & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right]\]

默认变换矩阵是单位矩阵,可以用eye函数创建它。下面是单位矩阵:

\[\left[ \begin{matrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right]\]

实现图形变换

使用hgtransform对象的Matrix属性可以给hgtransform对象的所有子对象应用一个变换。

变换是绝对意义上的,而不是相对于当前变换进行的。例如,如果应用一个变换,它在x方向上把hgtransform对象平移了5个单位,然后用另一个变换把对象在y方向上平移4个单位,则对象的最后位置是相对于原来位置在y方向上平移了4个单位,即起作用的是最后一次变换。如果希望作相对变换,必须把单个变换矩阵聚合到一个单一的矩阵中。

通常,通过聚合单个矩阵,并把结果赋给Matrix属性来实现矩阵聚合。注意,矩阵相乘是不可逆的,所以矩阵的顺序会影响计算结果。例如,假设要进行一个先缩放,然后平移、旋转的操作,可以象下面这样作矩阵相乘的运算:

C=R*T*S %从右向左计算

其中S是缩放矩阵,T是平移矩阵,R是旋转矩阵,而C是三种操作的组合。然后设置hgtransform对象的Matrix属性值为C。

code.matlab
set(hgtransform_handle,'Matrix',C)

注意,下面的语句行

code.matlab
set(hgtransform_handle,'Matrix',C)
set(hgtransform_handle,'Matrix',eye(4) )

code.matlab
C=eye(4)*R*T*S
set(hgtransform_handle,'Matrix',C)

是不等价的。把单位矩阵聚合到其他矩阵中对于复合矩阵没有影响。

因为变换操作是在绝对意义上指定的,所以可以通过将当前变换设置为单位矩阵来实现一系列变换操作。例如,下面的语句

code.matlab
set(hgtransform_handle,'Matrix',eye(4))

把对象hgtransform_handle返回到它的变换前的方位。

因为旋转是绕原点进行的,常常需要平移hgtransform对象,这样,旋转的目标坐标暂时位于原点。采用旋转变换矩阵以后,把hgtransform对象移回原点。

MATLAB操作中,用hgtransform函数创建hgtransform图形对象。变换时,将需要变换的对象作为hgtransform对象的子对象,例如

code.matlab
h=hgtransform;
surface('Parent',h,...)

将hgtransform对象作为父对象的主要优点在于,该对象提供了对其子对象进行变换的能力,这些变换包括平移、比例化和旋转等。hgtransform对象可以是任意个数axes对象子对象的父对象,包括其他hgtransform对象。

使用 makehgtform 创建用于转换、缩放和旋转图形对象的变换矩阵。通过将变换指定给父变换对象的 Matrix 属性来将变换应用于图形对象。

M=makehgtform 返回恒等变换矩阵。

M=makehgtform('translate',[tx ty tz]) 或 M=makehgtform('translate',tx,ty,tz) 返回分别沿 x、y 和 z 轴按 tx、ty 和 tz 进行转换的变换矩阵。

M=makehgtform('scale',s) 返回沿 x、y 和 z 坐标轴均匀缩放的变换矩阵。

M=makehgtform('scale',[sx,sy,sz]) 返回分别沿 x、y 和 z 轴按 sx、sy 和 sz 进行缩放的变换矩阵。

M=makehgtform('xrotate',t) 返回围绕 x 轴旋转 t 弧度的变换矩阵。

M=makehgtform('yrotate',t) 返回围绕 y 轴旋转 t 弧度的变换矩阵。

M=makehgtform('zrotate',t) 返回围绕 z 轴旋转 t 弧度的变换矩阵。

M=makehgtform('axisrotate',[ax,ay,az],t) 围绕轴 [ax ay az] 旋转 t 弧度。

请注意,可以在对 makehgtform 的一个调用中指定多个操作,MATLAB® 软件返回依次执行所有指定操作所得的变换矩阵。

下面生成一个三维曲面,然后对它进行平移、缩小和旋转操作。 在命令窗口输入代码。

首先创建一个axes对象并设置坐标系范围,调整视图。防止缩放时MATLAB自动调整范围。

code.matlab
>> ax=axes('XLim',[-6 6], 'YLim',[-6 6], 'ZLim',[-10 10]);
>> view(3)

创建希望作为hgtransform对象子对象的对象。

code.matlab
>> [x,y,z]=peaks;
>> h=surface(x,y,z);
>> h.EdgeColor='none';
>> camlight
>> box on

生成图2-27。

创建一个hgtransform对象,并作为刚刚创建的一系列曲面对象的父对象。

code.matlab
>> t=hgtransform('Parent',ax);
>> set(h,'Parent',t)

将平移、缩放和旋转矩阵初始化为单位矩阵。

code.matlab
>> Tz=eye(4);
>> Sxy=Tz;
>> Rz=Tz;

将图形沿z轴向下平移4个单位。

code.matlab
>> Tz=makehgtform('translate',0,0,-4);
>> set(t,'Matrix',Tz)

生成图2-28。

Document Image Document Image
\[\]

图2-27 生成图形 图2-28 将图形沿Z轴向下移动4个单位

将图形放大1.5倍。

code.matlab
>> Sxy=makehgtform('scale',1.5);
>> set(t, 'Matrix',Sxy)

生成图2-29。注意,曲面是在原始位置上放大的,而不是在下移4个单位后的位置上放大的。

将图形绕z轴逆时针方向旋转90度。

code.matlab
>> Rz=makehgtform('zrotate',pi/2);
>> set(t, 'Matrix',Rz)

生成图2-30。同样,曲面也是在原始位置上旋转的。

Document Image Document Image
\[\]

图2-29 图形放大1.5倍 图2-30 图形绕Z轴逆时针旋转90度

将图形先沿z轴往下移2个单位,然后放大到1.5倍并绕z轴逆时针方向旋转90度。注意,后面的变换矩阵是在原来矩阵的基础上左乘的。

code.matlab
>> set(t, 'Matrix',Rz*Sxy*Tz)

生成图2-31。

Document Image
\[\]

图2-31 对图形先后进行平移、放大和旋转操作

用单位矩阵重新设置原始方位和大小。

code.matlab
>> set(t, 'Matrix', eye(4))