实现图形变换

1. hgtransform对象

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

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

通常,通过聚合单个矩阵,并把结果赋给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对象移回原点。

2. 有关的函数

1> 用hgtransform函数创建hgtransform图形对象,其调用格式为:

h=hgtransform 创建一个hgtransform对象并返回它的句柄。

h=hgtransform('PropertyName',PropertyValue) 创建一个hgtransform对象,属性值的设置在参数列表中指定。

hgtransform对象可以包含其他对象,从而在处理可见性、大小、方向等属性时可以将hgtransform对象及其子对象作为单个实体进行处理。将一个hgtransform对象作为多个对象的父对象,可以组合它们。操作时将对象的Parent属性设置为hgtransform对象的句柄。例如

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

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

hgtransform对象可以是任意个数axes对象子对象的父对象,包括其他hgtransform对象。

hgtransform对象的父对象可以是axes对象或另一个hgtransform对象。尽管看不到hgtransform对象,但是将它的Visible属性设置为off可以让它的子对象也不可见。

2> 使用 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® 软件返回依次执行所有指定操作所得的变换矩阵。

3. 示例

本例首先生成一个三维曲面,然后对它进行平移、缩小和旋转操作。

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

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

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

code.matlab
>> [x,y,z]=peaks(30);
>> h=surface(x,y,z);

生成图5-1。

创建一个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)

生成图5-2。

Document Image Document Image
\[\]

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

将图形放大1.5倍。

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

生成图5-3。

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

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

生成图5-4。

Document Image Document Image
\[\]

图5-3 图形放大1.5倍 图5-4 图形绕Z轴逆时针旋转90度

将图形先沿z轴往下移2个单位,然后放大到1.5倍并绕z轴逆时针方向旋转90度。

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

生成图5-5。

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

code.matlab
>> set(t, 'Matrix', eye(4))
Document Image
\[\]

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