几何变换
我们有两种方式处理几何变换,要么变换几何对象,要么变换坐标系。这两者有密切的关系;但是,这两种变换的公式是不同的。我们只讨论变换几何对象。
欧几里得变换
欧几里得变换是最常用的变换之一。欧几里得变换包括平移、旋转或反射。
xy平面上的平移和旋转
我们可以通过给xy平面的点上累加一个向量(h,k)将其平移到一个新位置。
平移前的点坐标为(x,y),平移后的点坐标为(x′,y′)之间,我们有 x′=x+h 和 y′=y+k。
我们将其改成齐次坐标的形式,其第三个分量为1, 点(x,y)变成了以下形式:
⎣⎢⎡xy1⎦⎥⎤
下式是将(x,y)和(x′,y′)之间的关系表示成矩阵形式:
⎣⎢⎡x′y′1⎦⎥⎤=⎣⎢⎡100010hk1⎦⎥⎤⋅⎣⎢⎡xy1⎦⎥⎤⎣⎢⎡xy1⎦⎥⎤=⎣⎢⎡100010−h−k1⎦⎥⎤⋅⎣⎢⎡x′y′1⎦⎥⎤
因此,直线Ax+By+C=0经过平移后得到的新的程为Ax′+By′+(−Ah−Bk+C)=0。
如果一个点(x,y)绕坐标原点旋转角度a后变成一个新点(x′,y′),则变换关系可以写成如下:
⎣⎢⎡x′y′1⎦⎥⎤=⎣⎢⎡cosasina0−sinacosa0001⎦⎥⎤⋅⎣⎢⎡xy1⎦⎥⎤⎣⎢⎡xy1⎦⎥⎤=⎣⎢⎡cosa−sina0sinacosa0001⎦⎥⎤⋅⎣⎢⎡x′y′1⎦⎥⎤
因此,直线 Ax+By+C=0绕原点旋转 a 度得到新方程:
(Acosa−Bsina)x′+(Asina+Bcosa)y′+C=0
平移和旋转可以合并成一个等式,如下所示:
⎣⎢⎡x′y′1⎦⎥⎤=⎣⎢⎡cosasina0−sinacosa0hk1⎦⎥⎤⋅⎣⎢⎡xy1⎦⎥⎤⎣⎢⎡xy1⎦⎥⎤=⎣⎢⎡cosa−sina0sinacosa0−hcosa−ksinahsina−kcosa1⎦⎥⎤⋅⎣⎢⎡x′y′1⎦⎥⎤
上式意味着将点(x,y)绕坐标原点旋转角度a度,并将旋转结果沿着(h,k)的方向进行平移。然而,如果先应用平移(h,k),然后再进行角度为a的旋转(绕坐标原点),我们将得到不同的结果:
⎣⎢⎡x′y′1⎦⎥⎤=⎣⎢⎡cosasina0−sinacosa0hcosa−ksinahsina+kcosa1⎦⎥⎤⋅⎣⎢⎡xy1⎦⎥⎤⎣⎢⎡xy1⎦⎥⎤=⎣⎢⎡cosa−sina0sinacosa0−h−k1⎦⎥⎤⋅⎣⎢⎡x′y′1⎦⎥⎤
因此,旋转和平移不是可交换的!
空间中的平移和旋转
空间中的平移与平面类似:
⎣⎢⎢⎢⎡x′y′z′1⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡100001000010pqr1⎦⎥⎥⎥⎤⋅⎣⎢⎢⎢⎡xyz1⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡xyz1⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡100001000010−p−q−r1⎦⎥⎥⎥⎤⋅⎣⎢⎢⎢⎡x′y′z′1⎦⎥⎥⎥⎤
上述矩阵中,向量(p,q,r)表示平移量。
在空间中进行旋转更为复杂,因为我们可以绕着 x 轴、y 轴或 z 轴进行旋转。当绕 z 轴旋转时,只有 x 和 y 的坐标会改变,而 z 坐标保持不变,旋转方程为:
⎣⎢⎢⎢⎡x′y′z′1⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡cosasina00−sinacosa0000100001⎦⎥⎥⎥⎤⋅⎣⎢⎢⎢⎡xyz1⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡xyz1⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡cosa−sina00sinacosa0000100001⎦⎥⎥⎥⎤⋅⎣⎢⎢⎢⎡x′y′z′1⎦⎥⎥⎥⎤
绕x轴旋转一个角度为a的变换矩阵如下所示:
⎣⎢⎢⎢⎡x′y′z′1⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡10000cosasina00−sinacosa00001⎦⎥⎥⎥⎤⋅⎣⎢⎢⎢⎡xyz1⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡xyz1⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡10000cosa−sina00sinacosa00001⎦⎥⎥⎥⎤⋅⎣⎢⎢⎢⎡x′y′z′1⎦⎥⎥⎥⎤
假设a为90度,经过旋转后,y轴变为z轴,z轴变为原始y轴的负方向。
绕y轴旋转则的旋转方程可以表示为:
⎣⎢⎢⎢⎡x′y′z′1⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡cosa0−sina00100sina0cosa00001⎦⎥⎥⎥⎤⋅⎣⎢⎢⎢⎡xyz1⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡xyz1⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡cosa0sina00100−sina0cosa00001⎦⎥⎥⎥⎤⋅⎣⎢⎢⎢⎡x′y′z′1⎦⎥⎥⎥⎤
假设绕y轴旋转90度,经过旋转后,x轴旋转到了z轴的负方向,而z轴则旋转到了原来的x轴。
一个旋转矩阵和一个平移矩阵可以组合成一个单独的矩阵,如下所示,其中左上角的3x3矩阵中的r表示旋转, p, q, r表示平移向量。此矩阵表示先旋转,再跟着一个平移变化。
x′=⎣⎢⎢⎢⎡r11r21r310r12r22r320r13r23r330pqr1⎦⎥⎥⎥⎤⋅x
仿射变换
欧几里得变换后,几何体的长度和角度不变,几何体对象的形状也不会改变。也就是说,直线变换后仍然是直线,平面变换后仍是平面,圆变换后仍是圆,只有对象的位置和方向会改变。
仿射变换是欧几里得变换的泛化。 在仿射变换下,直线变换后仍是直线;但是,圆变换后会变成椭圆。长度和角度不再保持不变。
下面,我们讨论缩放、剪切和一般的仿射变换。
缩放
缩放变换可以拉伸或收缩给定的对象,从而改变长度和角度。因此,缩放不是欧几里得变换。缩放的含义是使坐标放大 p 倍。换句话说,x 坐标被放大了 p 倍。即x′ = px,因此x = x′/p。
对所有轴都可以应用缩放,每个轴都可以有不同的缩放因子。例如,如果x轴、y轴和z轴分别使用缩放因子p、q和r进行缩放,那么变换矩阵为:
⎣⎢⎢⎢⎡x′y′z′1⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡p0000q0000r00001⎦⎥⎥⎥⎤⋅⎣⎢⎢⎢⎡xyz1⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡xyz1⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡1/p00001/q00001/r00001⎦⎥⎥⎥⎤⋅⎣⎢⎢⎢⎡x′y′z′1⎦⎥⎥⎥⎤
剪切
剪切变换的效果看起来像是将几何对象“推”向与坐标平面(3D)或坐标轴(2D)平行的方向。在下面的例子中,红色圆柱体是将黄色圆柱体应用剪切变换的结果:

几何体朝着一个方向被推动的程度由剪切因子确定。在xy平面上,可以向x正向或负向推动,保持y方向不变,也可以向y方向推动,保持x方向固定。
以下是在x方向上进行的剪切变换,剪切因子为a时的变换矩阵:
⎣⎢⎡x′y′1⎦⎥⎤=⎣⎢⎡100a10001⎦⎥⎤⋅⎣⎢⎡xy1⎦⎥⎤⎣⎢⎡xy1⎦⎥⎤=⎣⎢⎡100−a10001⎦⎥⎤⋅⎣⎢⎡x′y′1⎦⎥⎤
若在y方向上的剪切变换,剪切因子为b,变换矩阵如下所示:
⎣⎢⎡x′y′1⎦⎥⎤=⎣⎢⎡1b0010001⎦⎥⎤⋅⎣⎢⎡xy1⎦⎥⎤⎣⎢⎡xy1⎦⎥⎤=⎣⎢⎡1−b0010001⎦⎥⎤⋅⎣⎢⎡x′y′1⎦⎥⎤
在空间中,可以沿着两个坐标轴方向推动,同时保持第三个方向固定。以下是分别在x和y方向上应用剪切变换,剪切因子分别为 a 和 b,并保持z坐标不变:
⎣⎢⎢⎢⎡x′y′z′1⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡10000100ab100001⎦⎥⎥⎥⎤⋅⎣⎢⎢⎢⎡xyz1⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡xyz1⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡10000100−a−b100001⎦⎥⎥⎥⎤⋅⎣⎢⎢⎢⎡x′y′z′1⎦⎥⎥⎥⎤
以下是变换后的结果:
x′=x+azy′=y+bzz′=z
因此,空间中的一个点 (x,y,z) 被转换为 (x+az,y+bz,z)。z 坐标不会改变,而 (x,y) 会以大小为z的比例朝着 (a,b,0) 的方向推移。
下面是$ xz $方向的剪切变换矩阵:
⎣⎢⎢⎢⎡x′y′z′1⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡1000a1c000100001⎦⎥⎥⎥⎤⋅⎣⎢⎢⎢⎡xyz1⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡xyz1⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡1000−a1−c000100001⎦⎥⎥⎥⎤⋅⎣⎢⎢⎢⎡x′y′z′1⎦⎥⎥⎥⎤
以下是yz方向上的剪切变换矩阵:
⎣⎢⎢⎢⎡x′y′z′1⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡1bc0010000100001⎦⎥⎥⎥⎤⋅⎣⎢⎢⎢⎡xyz1⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡xyz1⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡1−b−c0010000100001⎦⎥⎥⎥⎤⋅⎣⎢⎢⎢⎡x′y′z′1⎦⎥⎥⎥⎤
一般仿射变换
一般仿射变换矩阵形式如下:
⎣⎢⎢⎢⎡x′y′z′1⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡a11a21a310a12a22a320a13a23a330a14a24a341⎦⎥⎥⎥⎤⋅⎣⎢⎢⎢⎡xyz1⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡xyz1⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡a11a21a310a12a22a320a13a23a330a14a24a341⎦⎥⎥⎥⎤−1⋅⎣⎢⎢⎢⎡x′y′z′1⎦⎥⎥⎥⎤
观察所有先前讨论的矩阵变换,包括旋转和平移,会发现它们都符合这种形式,因此旋转和平移都是仿射变换。仿射变换不会改变多项式的次数,平行线/平面会变换后仍然是平行线/平面,相交线/平面会变换后仍然是相交线和平面。
然而,仿射变换不能保持几何的长度和角度不变,因此它们会改变几何的形状。
以下是对一个环面进行仿射变换的结果。一个环面由一个四次多项式表示。红色环面仍然是四次的;但是,它的形状被仿射变换改变了。

仿射变换是一个4×4矩阵,第四行的值分别是0、0、0和1。此外,如果仿射变换矩阵的逆矩阵存在,则称该仿射变换为非奇异;否则,它是奇异的。
投影变换
投影变换是最一般的线性变换。给定空间中的一个点的齐次坐标(x,y,z,w)及其在投影变换后的坐标(x′,y′,z′,w′),投影变换的形式如下:
⎣⎢⎢⎢⎡x′y′z′w′⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡p11p21p31p41p12p22p32p42p13p23p33p43p14p24p34p44⎦⎥⎥⎥⎤⋅⎣⎢⎢⎢⎡xyzw⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡xyzw⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡p11p21p31p41p12p22p32p42p13p23p33p43p14p24p34p44⎦⎥⎥⎥⎤−1⋅⎣⎢⎢⎢⎡x′y′z′w′⎦⎥⎥⎥⎤
在上面的阐述中,4×4矩阵必须是非奇异(即可逆) 的。因此,投影变换比仿射变换更加泛化,因为第四行元素不必须是0、0、0和1。
投影变换可以将有限点变换到无穷远处,也可以将无穷远的点变为有限范围内的点。让我们看一个例子。考虑下面的投影变换:
⎣⎢⎡x′y′z′⎦⎥⎤=⎣⎢⎡1−1−1−120001⎦⎥⎤⋅⎣⎢⎡xyw⎦⎥⎤⎣⎢⎡xyw⎦⎥⎤=⎣⎢⎡212111001⎦⎥⎤⋅⎣⎢⎡x′y′w′⎦⎥⎤
这个变换会将(x,y,w)=(1,0,1)映射到(x′,y′,w′)=(1,−1,0)。也就是说,这投影变换将xy平面上的点(1,0)映射到方向为(1,−1,0)的无穷远点。
根据矩阵方程x=Px′ 我们有:
x=2x′+y′
y=x′+y′
w=2x′+y′+w′
我们将上式代入圆方程x2+y2=1,结果如下:
x2+2xy+y2−4xw−2yw−w2=0
通过将上式除以 w2 将其转换回常规形式,得到:
x2+2xy+y2−4x−2y−1=0
这是一个抛物线!因此,一个没有无穷远点的圆被转换成一个有无穷远点的抛物线。
当使用投影变换时,与仿射变换一样,不会改变多项式的次数,但是两条平行(或相交的)线/平面可以变换为两条相交(或平行的)线/平面。
矩阵乘法和变换
我们介绍了几种变换。主要是两种形式,一种是从 x 到 x′ 的形式,另一种是从 x′ 到 x 的逆变换。在许多情况下,一个物体可能需要多种变换才能将其移动到期望的位置。
例如,我们可能需要一个矩阵形式的变换 q=Ap 将 p 移动到 q,然后进行第二个变换 r=Bq 将 q 移动到 r,接着进行另一个变换 s=Cr 将 r移动到 s。
p−>q−>r−>s 的整个变换过程可以总结为所有变换矩阵的乘积。注意,第一个(最后一个)变换矩阵在乘法序列中是最右侧(最左侧)的。
当我们计算时,我们只需计算CBA并将其视为一次变换,即可将p转换为s。
让我们看一个例子:假设我们想对一个对象进行以下变换:
-
在 x 方向上使用比例因子 5 进行缩放(使其变大五倍)。
-
然后绕 z 轴旋转 30 度。
-
然后分别在 x 和 y 方向上进行剪切变换,剪切因子分别为 2 和 3。
-
然后将点向(2,1,2)的方向移动。。
设拉伸、旋转、剪切和平移矩阵分别为A、B、C和D。根据之前的讨论,我们有 H=DCBA,该矩阵表示的是整个变换过程。
ABCDH=DCBA=⎣⎢⎢⎢⎡5000010000100001⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡3/21/200−1/23/20000100001⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡1000010023100001⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡1000010000102121⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡53/25/200−1/23/20023102121⎦⎥⎥⎥⎤
因此,经过上述四次变换后,将初始对象上一个点x变换到相应点 x′ 的变换矩阵公式为 x′=Hx=DCBAx。