几何变换

我们有两种方式处理几何变换,要么变换几何对象,要么变换坐标系。这两者有密切的关系;但是,这两种变换的公式是不同的。我们只讨论变换几何对象。

欧几里得变换

欧几里得变换是最常用的变换之一。欧几里得变换包括平移、旋转或反射。

xy平面上的平移和旋转

我们可以通过给xyxy平面的点上累加一个向量(h,k)(h, k)将其平移到一个新位置。
平移前的点坐标为(x,y)(x, y),平移后的点坐标为(x,y)(x', y')之间,我们有 x=x+hx' = x + hy=y+ky' = y + k

我们将其改成齐次坐标的形式,其第三个分量为1, 点(x,y)(x,y)变成了以下形式:

[xy1]\left[\begin{array}{c}x\\y\\1\end{array}\right]

下式是将(x,y)(x,y)(x,y)(x',y')之间的关系表示成矩阵形式:

[xy1]=[10h01k001][xy1][xy1]=[10h01k001][xy1]\left[\begin{array}{c}x'\\y'\\1\end{array}\right]=\left[\begin{array}{ccc}1&0&h\\0&1&k\\0&0&1\end{array}\right]\cdot\left[\begin{array}{c}x\\y\\1\end{array}\right]\quad\left[\begin{array}{c}x\\y\\1\end{array}\right]=\left[\begin{array}{ccc}1&0&-h\\0&1&-k\\0&0&1\end{array}\right]\cdot\left[\begin{array}{c}x'\\y'\\1\end{array}\right]

因此,直线Ax+By+C=0Ax + By + C = 0经过平移后得到的新的程为Ax+By+(AhBk+C)=0Ax' + By' + (-Ah - Bk + C) = 0

如果一个点(x,y)(x, y)绕坐标原点旋转角度aa后变成一个新点(x,y)(x', y'),则变换关系可以写成如下:

[xy1]=[cosasina0sinacosa0001][xy1][xy1]=[cosasina0sinacosa0001][xy1]\left[\begin{array}{c}x'\\y'\\1\end{array}\right]=\left[\begin{array}{ccc}\cos a&-\sin a&0\\\sin a&\cos a&0\\0&0&1\end{array}\right]\cdot\left[\begin{array}{c}x\\y\\1\end{array}\right]\quad\left[\begin{array}{c}x\\y\\1\end{array}\right]=\left[\begin{array}{ccc}\cos a&\sin a&0\\-\sin a&\cos a&0\\0&0&1\end{array}\right]\cdot\left[\begin{array}{c}x'\\y'\\1\end{array}\right]

因此,直线 Ax+By+C=0Ax + By + C = 0绕原点旋转 aa 度得到新方程:

(AcosaBsina)x+(Asina+Bcosa)y+C=0(A \cos a - B \sin a)x' + (A\sin a + B \cos a)y' + C = 0

平移和旋转可以合并成一个等式,如下所示:

[xy1]=[cosasinahsinacosak001][xy1][xy1]=[cosasinahcosaksinasinacosahsinakcosa001][xy1]\left[\begin{array}{c}x'\\y'\\1\end{array}\right]=\left[\begin{array}{ccc}\cos a&-\sin a&h\\\sin a&\cos a&k\\0&0&1\end{array}\right]\cdot\left[\begin{array}{c}x\\y\\1\end{array}\right]\\\left[\begin{array}{c}x\\y\\1\end{array}\right]=\left[\begin{array}{ccc}\cos a&\sin a&-h\cos a-k\sin a\\-\sin a&\cos a&h\sin a-k\cos a\\0&0&1\end{array}\right]\cdot\left[\begin{array}{c}x'\\y'\\1\end{array}\right]

上式意味着将点(x,y)(x,y)绕坐标原点旋转角度aa度,并将旋转结果沿着(h,k)(h,k)的方向进行平移。然而,如果先应用平移(h,k)(h,k),然后再进行角度为aa的旋转(绕坐标原点),我们将得到不同的结果:

[xy1]=[cosasinahcosaksinasinacosahsina+kcosa001][xy1][xy1]=[cosasinahsinacosak001][xy1]\left[\begin{array}{c}x'\\y'\\1\end{array}\right]=\left[\begin{array}{ccc}\cos a&-\sin a&h\cos a-k\sin a\\\sin a&\cos a&h\sin a+k\cos a\\0&0&1\end{array}\right]\cdot\left[\begin{array}{c}x\\y\\1\end{array}\right]\\\left[\begin{array}{c}x\\y\\1\end{array}\right]=\left[\begin{array}{ccc}\cos a&\sin a&-h\\-\sin a&\cos a&-k\\0&0&1\end{array}\right]\cdot\left[\begin{array}{c}x'\\y'\\1\end{array}\right]

因此,旋转和平移不是可交换的!

空间中的平移和旋转

空间中的平移与平面类似:

[xyz1]=[100p010q001r0001][xyz1][xyz1]=[100p010q001r0001][xyz1]\left[\begin{array}{c}x'\\y'\\z'\\1\end{array}\right]=\left[\begin{array}{cccc}1&0&0&p\\0&1&0&q\\0&0&1&r\\0&0&0&1\end{array}\right]\cdot\left[\begin{array}{c}x\\y\\z\\1\end{array}\right]\quad\left[\begin{array}{c}x\\y\\z\\1\end{array}\right]=\left[\begin{array}{cccc}1&0&0&-p\\0&1&0&-q\\0&0&1&-r\\0&0&0&1\end{array}\right]\cdot\left[\begin{array}{c}x'\\y'\\z'\\1\end{array}\right]

上述矩阵中,向量(p,q,r)(p, q, r)表示平移量。

在空间中进行旋转更为复杂,因为我们可以绕着 xx 轴、yy 轴或 zz 轴进行旋转。当绕 zz 轴旋转时,只有 xxyy 的坐标会改变,而 zz 坐标保持不变,旋转方程为:

[xyz1]=[cosasina00sinacosa0000100001][xyz1][xyz1]=[cosasina00sinacosa0000100001][xyz1]\left[\begin{array}{c}x'\\y'\\z'\\1\end{array}\right]=\left[\begin{array}{cccc}\cos a&-\sin a&0&0\\\sin a&\cos a&0&0\\0&0&1&0\\0&0&0&1\end{array}\right]\cdot\left[\begin{array}{c}x\\y\\z\\1\end{array}\right]\quad\left[\begin{array}{c}x\\y\\z\\1\end{array}\right]=\left[\begin{array}{cccc}\cos a&\sin a&0&0\\-\sin a&\cos a&0&0\\0&0&1&0\\0&0&0&1\end{array}\right]\cdot\left[\begin{array}{c}x'\\y'\\z'\\1\end{array}\right]

xx轴旋转一个角度为aa的变换矩阵如下所示:

[xyz1]=[10000cosasina00sinacosa00001][xyz1][xyz1]=[10000cosasina00sinacosa00001][xyz1]\left[\begin{array}{c}x'\\y'\\z'\\1\end{array}\right]=\left[\begin{array}{cccc}1&0&0&0\\0&\cos a&-\sin a&0\\0&\sin a&\cos a&0\\0&0&0&1\end{array}\right]\cdot\left[\begin{array}{c}x\\y\\z\\1\end{array}\right]\quad\left[\begin{array}{c}x\\y\\z\\1\end{array}\right]=\left[\begin{array}{cccc}1&0&0&0\\0&\cos a&\sin a&0\\0&-\sin a&\cos a&0\\0&0&0&1\end{array}\right]\cdot\left[\begin{array}{c}x'\\y'\\z'\\1\end{array}\right]

假设aa为90度,经过旋转后,yy轴变为zz轴,zz轴变为原始yy轴的负方向。

yy轴旋转则的旋转方程可以表示为:

[xyz1]=[cosa0sina00100sina0cosa00001][xyz1][xyz1]=[cosa0sina00100sina0cosa00001][xyz1]\left[\begin{array}{c}x'\\y'\\z'\\1\end{array}\right]=\left[\begin{array}{cccc}\cos a&0&\sin a&0\\0&1&0&0\\-\sin a&0&\cos a&0\\0&0&0&1\end{array}\right]\cdot\left[\begin{array}{c}x\\y\\z\\1\end{array}\right]\quad\left[\begin{array}{c}x\\y\\z\\1\end{array}\right]=\left[\begin{array}{cccc}\cos a&0&-\sin a&0\\0&1&0&0\\\sin a&0&\cos a&0\\0&0&0&1\end{array}\right]\cdot\left[\begin{array}{c}x'\\y'\\z'\\1\end{array}\right]

假设绕yy轴旋转90度,经过旋转后,xx轴旋转到了zz轴的负方向,而zz轴则旋转到了原来的xx轴。

一个旋转矩阵和一个平移矩阵可以组合成一个单独的矩阵,如下所示,其中左上角的3x33x3矩阵中的rr表示旋转, pp, qq, rr表示平移向量。此矩阵表示先旋转,再跟着一个平移变化

x=[r11r12r13pr21r22r23qr31r32r33r0001]x\mathbf{x}^{\prime}=\left[\begin{array}{cccc}r_{11}&r_{12}&r_{13}&p\\r_{21}&r_{22}&r_{23}&q\\r_{31}&r_{32}&r_{33}&r\\0&0&0&1\end{array}\right]\cdot\mathbf{x}

仿射变换

欧几里得变换后,几何体的长度和角度不变,几何体对象的形状也不会改变。也就是说,直线变换后仍然是直线,平面变换后仍是平面,圆变换后仍是圆,只有对象的位置和方向会改变。

仿射变换是欧几里得变换的泛化。 在仿射变换下,直线变换后仍是直线;但是,圆变换后会变成椭圆。长度和角度不再保持不变。

下面,我们讨论缩放、剪切和一般的仿射变换。

缩放

缩放变换可以拉伸或收缩给定的对象,从而改变长度和角度。因此,缩放不是欧几里得变换。缩放的含义是使坐标放大 pp 倍。换句话说,xx 坐标被放大pp 倍。即xx' = pxp x,因此xx = x/px'/p

对所有轴都可以应用缩放,每个轴都可以有不同的缩放因子。例如,如果xx轴、yy轴和zz轴分别使用缩放因子ppqqrr进行缩放,那么变换矩阵为:

[xyz1]=[p0000q0000r00001][xyz1][xyz1]=[1/p00001/q00001/r00001][xyz1]\left[\begin{array}{c}x'\\y'\\z'\\1\end{array}\right]=\left[\begin{array}{cccc}p&0&0&0\\0&q&0&0\\0&0&r&0\\0&0&0&1\end{array}\right]\cdot\left[\begin{array}{c}x\\y\\z\\1\end{array}\right]\quad\left[\begin{array}{c}x\\y\\z\\1\end{array}\right]=\left[\begin{array}{cccc}1/p&0&0&0\\0&1/q&0&0\\0&0&1/r&0\\0&0&0&1\end{array}\right]\cdot\left[\begin{array}{c}x'\\y'\\z'\\1\end{array}\right]

剪切

剪切变换的效果看起来像是将几何对象“推”向与坐标平面(3D)或坐标轴(2D)平行的方向。在下面的例子中,红色圆柱体是将黄色圆柱体应用剪切变换的结果:

img

几何体朝着一个方向被推动的程度由剪切因子确定。在xyxy平面上,可以向xx正向或负向推动,保持yy方向不变,也可以向yy方向推动,保持xx方向固定。

以下是在xx方向上进行的剪切变换,剪切因子为aa时的变换矩阵:

[xy1]=[1a0010001][xy1][xy1]=[1a0010001][xy1]\left[\begin{array}{c}x'\\y'\\1\end{array}\right]=\left[\begin{array}{ccc}1&a&0\\0&1&0\\0&0&1\end{array}\right]\cdot\left[\begin{array}{c}x\\y\\1\end{array}\right]\quad\left[\begin{array}{c}x\\y\\1\end{array}\right]=\left[\begin{array}{ccc}1&-a&0\\0&1&0\\0&0&1\end{array}\right]\cdot\left[\begin{array}{c}x'\\y'\\1\end{array}\right]

若在yy方向上的剪切变换,剪切因子为bb,变换矩阵如下所示:

[xy1]=[100b10001][xy1][xy1]=[100b10001][xy1]\left[\begin{array}{c}x'\\y'\\1\end{array}\right]=\left[\begin{array}{ccc}1&0&0\\b&1&0\\0&0&1\end{array}\right]\cdot\left[\begin{array}{c}x\\y\\1\end{array}\right]\quad\left[\begin{array}{c}x\\y\\1\end{array}\right]=\left[\begin{array}{ccc}1&0&0\\-b&1&0\\0&0&1\end{array}\right]\cdot\left[\begin{array}{c}x'\\y'\\1\end{array}\right]

在空间中,可以沿着两个坐标轴方向推动,同时保持第三个方向固定。以下是分别在xxyy方向上应用剪切变换,剪切因子分别为 aabb,并保持zz坐标不变:

[xyz1]=[10a001b000100001][xyz1][xyz1]=[10a001b000100001][xyz1]\left[\begin{array}{c}x'\\y'\\z'\\1\end{array}\right]=\left[\begin{array}{cccc}1&0&a&0\\0&1&b&0\\0&0&1&0\\0&0&0&1\end{array}\right]\cdot\left[\begin{array}{c}x\\y\\z\\1\end{array}\right]\quad\left[\begin{array}{c}x\\y\\z\\1\end{array}\right]=\left[\begin{array}{cccc}1&0&-a&0\\0&1&-b&0\\0&0&1&0\\0&0&0&1\end{array}\right]\cdot\left[\begin{array}{c}x'\\y'\\z'\\1\end{array}\right]

以下是变换后的结果:

x=x+azy=y+bzz=z\begin{aligned}&x^{\prime}=x+az\\&y^{\prime}=y+bz\\&z^{\prime}=z\end{aligned}

因此,空间中的一个点 (x,y,z)(x, y, z) 被转换为 (x+az,y+bz,z)(x + az, y + bz, z)zz 坐标不会改变,而 (x,y)(x,y) 会以大小为zz的比例朝着 (a,b,0)(a, b, 0) 的方向推移

下面是$ xz $方向的剪切变换矩阵:

[xyz1]=[1a0001000c100001][xyz1][xyz1]=[1a0001000c100001][xyz1]\left[\begin{array}{c}x'\\y'\\z'\\1\end{array}\right]=\left[\begin{array}{cccc}1&a&0&0\\0&1&0&0\\0&c&1&0\\0&0&0&1\end{array}\right]\cdot\left[\begin{array}{c}x\\y\\z\\1\end{array}\right]\quad\left[\begin{array}{c}x\\y\\z\\1\end{array}\right]=\left[\begin{array}{cccc}1&-a&0&0\\0&1&0&0\\0&-c&1&0\\0&0&0&1\end{array}\right]\cdot\left[\begin{array}{c}x'\\y'\\z'\\1\end{array}\right]

以下是yzyz方向上的剪切变换矩阵:

[xyz1]=[1000b100c0100001][xyz1][xyz1]=[1000b100c0100001][xyz1]\left[\begin{array}{c}x'\\y'\\z'\\1\end{array}\right]=\left[\begin{array}{cccc}1&0&0&0\\b&1&0&0\\c&0&1&0\\0&0&0&1\end{array}\right]\cdot\left[\begin{array}{c}x\\y\\z\\1\end{array}\right]\quad\left[\begin{array}{c}x\\y\\z\\1\end{array}\right]=\left[\begin{array}{cccc}1&0&0&0\\-b&1&0&0\\-c&0&1&0\\0&0&0&1\end{array}\right]\cdot\left[\begin{array}{c}x'\\y'\\z'\\1\end{array}\right]

一般仿射变换

一般仿射变换矩阵形式如下:

[xyz1]=[a11a12a13a14a21a22a23a24a31a32a33a340001][xyz1][xyz1]=[a11a12a13a14a21a22a23a24a31a32a33a340001]1[xyz1]\left[\begin{array}{c}x'\\y'\\z'\\1\end{array}\right]=\left[\begin{array}{cccc}a_{11}&a_{12}&a_{13}&a_{14}\\a_{21}&a_{22}&a_{23}&a_{24}\\a_{31}&a_{32}&a_{33}&a_{34}\\0&0&0&1\end{array}\right]\cdot\left[\begin{array}{c}x\\y\\z\\1\end{array}\right]\quad\left[\begin{array}{c}x\\y\\z\\1\end{array}\right]=\left[\begin{array}{cccc}a_{11}&a_{12}&a_{13}&a_{14}\\a_{21}&a_{22}&a_{23}&a_{24}\\a_{31}&a_{32}&a_{33}&a_{34}\\0&0&0&1\end{array}\right]^{-1}\cdot\left[\begin{array}{c}x'\\y'\\z'\\1\end{array}\right]

观察所有先前讨论的矩阵变换,包括旋转和平移,会发现它们都符合这种形式,因此旋转和平移都是仿射变换。仿射变换不会改变多项式的次数,平行线/平面会变换后仍然是平行线/平面,相交线/平面会变换后仍然是相交线和平面。
然而,仿射变换不能保持几何的长度和角度不变,因此它们会改变几何的形状。

以下是对一个环面进行仿射变换的结果。一个环面由一个四次多项式表示。红色环面仍然是四次的;但是,它的形状被仿射变换改变了。

img

仿射变换是一个4×44×4矩阵,第四行的值分别是0000、0、011。此外,如果仿射变换矩阵的逆矩阵存在,则称该仿射变换为非奇异;否则,它是奇异的。

投影变换

投影变换是最一般的线性变换。给定空间中的一个点的齐次坐标(x,y,z,w)(x,y,z,w)及其在投影变换后的坐标(x,y,z,w)(x',y',z',w'),投影变换的形式如下:

[xyzw]=[p11p12p13p14p21p22p23p24p31p32p33p34p41p42p43p44][xyzw][xyzw]=[p11p12p13p14p21p22p23p24p31p32p33p34p41p42p43p44]1[xyzw]\left[\begin{array}{c}x'\\y'\\z'\\w'\end{array}\right]=\left[\begin{array}{cccc}p_{11}&p_{12}&p_{13}&p_{14}\\p_{21}&p_{22}&p_{23}&p_{24}\\p_{31}&p_{32}&p_{33}&p_{34}\\p_{41}&p_{42}&p_{43}&p_{44}\end{array}\right]\cdot\left[\begin{array}{c}x\\y\\z\\w\end{array}\right]\quad\left[\begin{array}{c}x\\y\\z\\w\end{array}\right]=\left[\begin{array}{cccc}p_{11}&p_{12}&p_{13}&p_{14}\\p_{21}&p_{22}&p_{23}&p_{24}\\p_{31}&p_{32}&p_{33}&p_{34}\\p_{41}&p_{42}&p_{43}&p_{44}\end{array}\right]^{-1}\cdot\left[\begin{array}{c}x'\\y'\\z'\\w'\end{array}\right]

在上面的阐述中,4×44×4矩阵必须是非奇异(即可逆) 的。因此,投影变换比仿射变换更加泛化,因为第四行元素不必须是0000、0、011

投影变换可以将有限点变换到无穷远处,也可以将无穷远的点变为有限范围内的点。让我们看一个例子。考虑下面的投影变换:

[xyz]=[110120101][xyw][xyw]=[210110211][xyw]\left[\begin{array}{r}x'\\y'\\z'\end{array}\right]=\left[\begin{array}{rrr}1&-1&0\\-1&2&0\\-1&0&1\end{array}\right]\cdot\left[\begin{array}{r}x\\y\\w\end{array}\right]\quad\left[\begin{array}{r}x\\y\\w\end{array}\right]=\left[\begin{array}{rrr}2&1&0\\1&1&0\\2&1&1\end{array}\right]\cdot\left[\begin{array}{r}x'\\y'\\w'\end{array}\right]

这个变换会将(x,y,w)=(1,0,1)(x,y,w)=(1,0,1)映射到(x,y,w)=(1,1,0)(x',y',w')=(1,-1,0)。也就是说,这投影变换将xyxy平面上的点(1,0)映射到方向为(1,1,0)(1,-1,0)的无穷远点。

根据矩阵方程x=Pxx=\mathbf{P}x' 我们有:

x=2x+yx = 2x' + y'

y=x+yy = x' + y'

w=2x+y+ww = 2x' + y' + w'

我们将上式代入圆方程x2+y2=1x^2 + y^2 = 1,结果如下:

x2+2xy+y24xw2yww2=0x^2+2xy+y^2-4xw-2yw-w^2=0

通过将上式除以 w2w^2 将其转换回常规形式,得到:

x2+2xy+y24x2y1=0x^2 + 2xy + y^2 - 4x - 2y - 1 = 0

这是一个抛物线!因此,一个没有无穷远点的圆被转换成一个有无穷远点的抛物线。

当使用投影变换时,与仿射变换一样,不会改变多项式的次数,但是两条平行(或相交的)线/平面可以变换为两条相交(或平行的)线/平面。

矩阵乘法和变换

我们介绍了几种变换。主要是两种形式,一种是从 xxxx' 的形式,另一种是从 xx'xx 的逆变换。在许多情况下,一个物体可能需要多种变换才能将其移动到期望的位置。

例如,我们可能需要一个矩阵形式的变换 q=Apq=\mathbf{A}ppp 移动到 qq,然后进行第二个变换 r=Bqr = \mathbf{B}qqq 移动到 rr,接着进行另一个变换 s=Crs=\mathbf{C}rrr移动到 ss

p>q>r>sp -> q -> r -> s 的整个变换过程可以总结为所有变换矩阵的乘积。注意,第一个(最后一个)变换矩阵在乘法序列中是最右侧(最左侧)的。

当我们计算时,我们只需计算CBA\mathbf{CBA}并将其视为一次变换,即可将pp转换为ss

让我们看一个例子:假设我们想对一个对象进行以下变换:

  1. xx 方向上使用比例因子 5 进行缩放(使其变大五倍)。

  2. 然后绕 zz 轴旋转 30 度。

  3. 然后分别在 xxyy 方向上进行剪切变换,剪切因子分别为 2 和 3。

  4. 然后将点向(2,1,2)(2, 1, 2)的方向移动。。

设拉伸、旋转、剪切和平移矩阵分别为AABBCCDD。根据之前的讨论,我们有 H=DCBAH = DCBA,该矩阵表示的是整个变换过程。

A=[5000010000100001]B=[3/21/2001/23/20000100001]C=[1020013000100001]D=[1002010100120001]H=DCBA=[53/21/2225/23/23100120001]\begin{aligned} \text{A}& =\left[\begin{array}{cccc}5&0&0&0\\0&1&0&0\\0&0&1&0\\0&0&0&1\end{array}\right] \\ \text{B}& =\left[\begin{array}{cccc}\sqrt{3}/2&-1/2&0&0\\1/2&\sqrt{3}/2&0&0\\0&0&1&0\\0&0&0&1\end{array}\right] \\ \text{C}& =\left[\begin{array}{cccc}1&0&2&0\\0&1&3&0\\0&0&1&0\\0&0&0&1\end{array}\right] \\ \text{D}& =\left[\begin{array}{cccc}1&0&0&2\\0&1&0&1\\0&0&1&2\\0&0&0&1\end{array}\right] \\ \mathbf{H}=\mathbf{DCBA}& =\left[\begin{array}{cccc}5\sqrt{3}/2&-1/2&2&2\\5/2&\sqrt{3}/2&3&1\\0&0&1&2\\0&0&0&1\end{array}\right] \end{aligned}

因此,经过上述四次变换后,将初始对象上一个点xx变换到相应点 xx' 的变换矩阵公式为 x=Hx=DCBAxx' = Hx = DCBAx