图形变换一般是指将图形的几何信息经过几何变换后产生新的图形。图形变换既可以看作是图形不动而坐标系变动,变动后该图形在新的坐标系下具有新的坐标值,也可以看作是坐标系不动而图形变动,变动后的图形在坐标系中的坐标值发生变化。对于线框图形的变换,通常是以点变换为基础,把图形的一系列顶点作几何变换后,连接新的顶点序列即可产生新的变换后的图形。对于用参数方程描述的图形,可以通过参数方程几何变换,实现对图形的变换。
在图形学中,在实现图形变换时通常采用齐次坐标系来表示坐标值,这样可方便地用变换矩阵实现对图形的变换。所谓齐次坐标表示法就是用n+1维向量表示一个n维向量,即n维空间中的点的位置向量(P1,P2,…Pn)被表示为具有n+1个坐标分量的向量(hP1,hP2,…,hPn,h)。齐次坐标表示法一方面可以表达无穷远点。例如,n+1维中,h=0的齐次坐标实际上表示了一个n维的无穷远点,另一方面它提供了用矩阵运算把二维、三维甚至高维空间中的一个点集从一个坐标系变换到另一个坐标系的有效方法。下面除非特别声明,否则,所讨论的几何变换均是指在齐次坐标系下。
3.1 图形的几何变换
基本的几何变换研究物体坐标在直角坐标系统内的平移、旋转和变比的规律,按照坐标的维数不同,基本变换可分为二维几何变换和三维几何变换两大类。但对于可用参数表示的曲线、曲面等图形的变换,基于效率的考虑,一般通过对其参数方程作变换来实现对整个图形的变换,而不是逐点进行,下面分别加以介绍。
3.1.1 二维图形几何变换
一、基本变换
1平移(Translation) 平移是将对象从一个位置(x, y)移到另一个位置(x′,y′)的变换(图3.1)。Tx=x′-x, Ty=y′-y称为平移距离。平移变换的公式为:
x′=x+Tx
y′=y+Ty
图3.1
2旋转(Rotation) 旋转是以某个参考点为圆心,将对象上的各点(x,y)围绕圆心转动一个逆时针角度θ,变为新的坐标(x′,y′)的变换。当参考点为(0,0)时,旋转的公式为(图3.2):
x′=rcos(α+θ)=rcosαcosθ-rsinαsinθ
y′=rsin(α+θ)=rsinαcosθ+rcosαsinθ
∵ x=rcosα,y=rsinα,所以上式可化为:
x′=xcosθ-ysinα
y′=ycosθ+xsinα
如果参考点不是(0,0),而是任意一点(xr,yr),那么,绕(xr,yr)点的旋转由三个步骤完成:1)将对象平移Tx=-xr,Ty=yr;2)按式(32)作旋转变换;3)平移Tx=xr,Ty=yr。组合这三个步骤的计算公式为:
x′=xr+(x-xr)cosθ-(y-yr)sinθ
y′=yr+(y-yr)cosθ+(x-xr)sinθ
图3.2
3变比(scaling) 变比是使对象按比例因子(Sx,Sy)放大或缩小的变换(图3.3)。变比计算公式为:
x′=x·sx
y′=y·sy
图3.3
从图3.3可见,按式(3.3)变比时,不仅对象的大小变化,而且,对象离原点的距离也发生了变化。如果只希望变换对象的大小,而不希望变比对角离原点的距离,则可采用固定点变比(scaling relative to a fixed point)。如果(33),以a为固定点进行变比的方法是:1)作平移Tx=-xa,Ty=-ya;2)按式(33)作变比;3)作1)的逆变换,即作平移Tx=xa,Ty=ya。
当比例因子Sx或Sy小于0时,对象不仅变化大小,而且分别按x轴,或y的轴被反射。
图3.4
图3.4(a)表示当sy=-1,sx=1时的变化,此时按x轴反射。图3.4(b)表示当sy=1,sx=-1时的变比,此时按y轴反射。图3.4(c)示出当sx=-1,sy=-1时按(0,0)原点反射的情况。
二、变换矩阵
上述3种基本变换公式都可以表示为3×3的变换矩阵和齐次坐标相乘的形式。对于平移、旋转、变比分别为:
1平移的矩阵运算表示:
(3.1)
简记为p′=p·T(Tx,Ty)
其中 p=[x′ y′ 1]
p=[x y 1]
T(Tx,Ty)= 表示平移矩阵。
2旋转的矩阵运算表示为:
[x′ y′ 1]=[x y 1] (3.2)
简记为p′=p·R(θ)其中R(θ)表示旋转矩阵。
3变比的矩阵运算表示为:
[x′ y′ 1]=[x y 1] (3.3)
简记为p′=p·S(Sx,Sy),其中(sx,sy)表示变化矩阵。
三、级联变换(Composite Transformation)
一个比较复杂的变换要连续进行若干个基本变换才能完成。例如围绕任意点(xr,yr)的旋转,就要通过3个基本变换T(-xr,-yr),R(θ),T(xr, yr)才能完成。这些由基本变换构成的连续变换序列称为级联变换。
变换的矩阵形式使得级联变换的计算工作量大为减少。以绕任意点旋转变换为例,本应进行如下三次变换:
p′=p·T(-xr,-yr) (3.4)
p″=p′·R(θ) (3.5)
p=p″·T(xr,yr) (3.6)
将式(3.4)、(3.5)式代入式(3.6),得:
p=p·T(-xr,-yr)·R(θ)·T(xr,yr)
令Tc=T(-xr,-yr)·R(θ)·T(xr,yr)则有
p=p·Tc
Tc称为级联变换矩阵。由上面推导可知在计算级联变换时,首先可将各基本变换矩阵按序相乘,形成总的级联变换矩阵Tc。然后,坐标只须与Tc相乘一次,便可同时完成一连串基本变换。所以,采用级联变换矩阵,大大节省了坐标乘法所耗费的运算时间。
四、二维几何变换的指令
二维基本变换的指令有三条,分别执行建立变换矩阵、积累变换和坐标变换等三种操作。
1建立变换矩阵的指令为:
creat_transformation_matrix(xf,yf,sx,sy,xr,yr,α,tx,ty,matrix);
其中,xf,yf 是固定点变比的固定点坐标;
sx,sy 是固定点变比的变比因子;
xr,yr 是任意点旋转的任意点坐标;
α 是旋转的角度;
tx,ty 是平移的距离;
matrix 是所建立的变换矩阵。
此指令按参数的先后次序依次进行变换,即执行如下操作:
matrix=T(-xf,-yf)·S(sx,sy)·T(xf,yf)·T(-xr,-yr)·R(α)
T(xr,yr)·T(tx,ty)
2积累变换的指令为:
accumulate_transformation_matrix(matrix1,matrix2,matrix);
其中,matrix1,matrix2是2个输入矩阵,matrix是返回矩阵。它们都为3×3矩阵。该指令完成如下功能:
matrix=matrix1·matrix2
3坐标变换的指令为:
set_segment_transformation(Id,matrix);其中Id是对象的编码(segment的概念在下章介绍),matrix是几何变换矩阵。该指令完成如下功能:
[x′id y′id 1]=[xid yid 1]·matrix。
其中xid, yid是Id对象的所有坐标值。