阅读本文前,最好理解了 矩阵乘法
在计算机图形学里,大量应用矩阵,这里介绍几个常见的变换。
图形缩放 缩放变换中,如果一个图片以原点 ( 0 , 0 ) (0,0) ( 0 , 0 ) 为中心缩放 s s s 倍。那么点 ( x , y ) (x, y) ( x , y ) 变换后数学形式可以表示为
x ′ = s x y ′ = s y \begin{aligned}
& x^{\prime}=s x \\
& y^{\prime}=s y
\end{aligned} x ′ = s x y ′ = sy 写成矩阵形式为:
[ x ′ y ′ ] = [ s x 0 0 s y ] [ x y ] \left[\begin{array}{l}
x^{\prime} \\
y^{\prime}
\end{array}\right]=\left[\begin{array}{ll}
s_x & 0 \\
0 & s_y
\end{array}\right]\left[\begin{array}{l}
x \\
y
\end{array}\right] [ x ′ y ′ ] = [ s x 0 0 s y ] [ x y ] 当然,我们也可以给 x 轴和 y 轴不同的缩放倍数 s x s x s x 和 s y s y sy 。在非均匀情况下,缩放变换的矩阵形式为
[ x ′ y ′ ] = [ s x 0 0 s y ] [ x y ] . . . ( 图像缩放公式 ) \boxed{
\left[\begin{array}{l}
x^{\prime} \\
y^{\prime}
\end{array}\right]=\left[\begin{array}{cc}
s_x & 0 \\
0 & s_y
\end{array}\right]\left[\begin{array}{l}
x \\
y
\end{array}\right] ...(\text{图像缩放公式})
} [ x ′ y ′ ] = [ s x 0 0 s y ] [ x y ] ... ( 图像缩放公式 ) 下图展示了图像缩放示意图
{width=600px}
例 下面矩阵乘法显示一个向量[ 1 , 1 ] [1,1] [ 1 , 1 ] 乘以一个矩阵后,变成 [ 2 , 1 ] [2,1] [ 2 , 1 ]
一个向量左乘对角阵相当于对向量各维坐标值进行缩放,缩放的比例就是对角阵元素的值 。当然了,这里的向量缩放这里也可以看成坐标轴进行缩放,两者是等价的
[ 2 0 0 1 ] [ 1 1 ] = [ 2 1 ] \left[\begin{array}{ll}
2 & 0 \\
0 & 1
\end{array}\right]\left[\begin{array}{l}
1 \\
1
\end{array}\right]=\left[\begin{array}{l}
2 \\
1
\end{array}\right] [ 2 0 0 1 ] [ 1 1 ] = [ 2 1 ] 从几何意义上看,向量从A B ⃗ \vec{AB} A B 变成A C ⃗ \vec{AC} A C
你也可以从物理上理解,一个物体原先速度为( 1 , 1 ) (1,1) ( 1 , 1 ) ,他分解为最平速度为1,和垂直速度1,乘以矩阵后,水平速度变成了2,而垂直速度仍然是1.
{width=300px}
图像旋转 我们默认旋转变换(Rotate)都绕着原点( 0 , 0 ) (0, 0) ( 0 , 0 ) 旋转,并且默认旋转方向为逆时针方向(逆时针方向旋转角度值为正,顺时针旋转角度值为负),当一个点 ( x , y ) (x,y) ( x , y ) 绕着原点( 0 , 0 ) (0,0) ( 0 , 0 ) 旋转θ \theta θ 角时,变换矩阵可以表示为:
[ x ′ y ′ ] = [ cos θ − sin θ sin θ cos θ ] [ x y ] . . . ( 图像旋转公式 ) \boxed
{
\left[\begin{array}{l}
x^{\prime} \\
y^{\prime}
\end{array}\right]=\left[\begin{array}{cc}
\cos \theta & -\sin \theta \\
\sin \theta & \cos \theta
\end{array}\right]\left[\begin{array}{l}
x \\
y
\end{array}\right] ...(\text{图像旋转公式})
} [ x ′ y ′ ] = [ cos θ sin θ − sin θ cos θ ] [ x y ] ... ( 图像旋转公式 ) 证明 我们在直角坐标系中绘制一个边长为 1 的正方形,点 A A A 坐标为 ( 1 , 0 ) (1,0) ( 1 , 0 ) ,点 B B B 坐标为 ( 0 , 1 ) (0,1) ( 0 , 1 ) 。正方形沿着原点 ( 0 , 0 ) (0,0) ( 0 , 0 ) 旋转的角度为 θ \theta θ 角 参考下图。
{width=500px}
我们设原坐标里任一点( x , y ) (x,y) ( x , y ) 经过旋转后,在新坐标为( x ′ , y ′ ) (x',y') ( x ′ , y ′ ) ,现在找一下新旧坐标系下“点”的关系。
[ x ′ y ′ ] = [ A B C D ] [ x y ] \left[\begin{array}{l}
x^{\prime} \\
y^{\prime}
\end{array}\right]=\left[\begin{array}{ll}
A & B \\
C & D
\end{array}\right]\left[\begin{array}{l}
x \\
y
\end{array}\right] [ x ′ y ′ ] = [ A C B D ] [ x y ] 接下来去两个特殊点,代入点 A A A 的的值 ( 1 , 0 ) (1,0) ( 1 , 0 ) 可以得到:
[ cos θ sin θ ] = [ A B C D ] [ 1 0 ] \left[\begin{array}{c}
\cos \theta \\
\sin \theta
\end{array}\right]=\left[\begin{array}{ll}
A & B \\
C & D
\end{array}\right]\left[\begin{array}{l}
1 \\
0
\end{array}\right] [ cos θ sin θ ] = [ A C B D ] [ 1 0 ] 解方程得到:
A = cos θ C = sin θ \begin{aligned}
& A=\cos \theta \\
& C=\sin \theta
\end{aligned} A = cos θ C = sin θ 代人点 B B B 的的值 ( 0 , 1 ) (0,1) ( 0 , 1 ) 可以得到:
[ − sin θ cos θ ] = [ A B C D ] [ 0 1 ] \left[\begin{array}{c}
-\sin \theta \\
\cos \theta
\end{array}\right]=\left[\begin{array}{ll}
A & B \\
C & D
\end{array}\right]\left[\begin{array}{l}
0 \\
1
\end{array}\right] [ − sin θ cos θ ] = [ A C B D ] [ 0 1 ] 解方程得到:
B = − sin θ D = cos θ \begin{aligned}
& B=-\sin \theta \\
& D=\cos \theta
\end{aligned} B = − sin θ D = cos θ 因此,坐标旋转公式为
A rotate = [ cos θ − sin θ sin θ cos θ ] A_{\text {rotate }}=\left[\begin{array}{cc}
\cos \theta & -\sin \theta \\
\sin \theta & \cos \theta
\end{array}\right] A rotate = [ cos θ sin θ − sin θ cos θ ] 下图显示了一个图形旋转
{width=600px}
例 考虑θ = 45 ∘ \theta=45^{\circ} θ = 4 5 ∘ 时, cos θ = sin θ = 2 2 \cos \theta=\sin \theta= \frac{\sqrt{2}}{2} cos θ = sin θ = 2 2 ,此时旋转矩阵A A A 为
A = [ 2 2 − 2 2 2 2 2 2 ] \boldsymbol{A}=\left[\begin{array}{cc}
\frac{\sqrt{2}}{2} & -\frac{\sqrt{2}}{2} \\
\frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2}
\end{array}\right] A = [ 2 2 2 2 − 2 2 2 2 ] 这意味着任何一个向量乘以该矩阵将旋转45 ∘ 45^{\circ} 4 5 ∘
矩阵的旋转与缩放 在一维里,一个向量乘以− 1 -1 − 1 表示逆时针旋转180 180 180 度,在二维复平面里,引入了虚数单位i i i ,当一个数乘以i i i 后,相当于逆时针旋转90 90 90 度。由此,可以对其扩展。
一个矩阵乘以一个向量, 一般将会对向量的几何图形进行旋转和伸缩变化。常见的一个例子就是旋转矩阵, 旋转矩阵只对向量进行旋转变化而没有伸缩变化。例如, 二阶旋转矩阵 A \boldsymbol{A} A :
A = [ cos θ − sin θ sin θ cos θ ] \boldsymbol{A}=\left[\begin{array}{cc}
\cos \theta & -\sin \theta \\
\sin \theta & \cos \theta
\end{array}\right] A = [ cos θ sin θ − sin θ cos θ ] 首先看一下旋转矩阵 A \boldsymbol{A} A 对单位向量 i = ( 1 , 0 ) , j = ( 0 , 1 ) \boldsymbol{i}=(1,0), \boldsymbol{j}=(0,1) i = ( 1 , 0 ) , j = ( 0 , 1 ) 的作用效果:
A i = [ cos θ − sin θ sin θ cos θ ] ( 1 0 ) = ( cos θ sin θ ) \begin{gathered}
\boldsymbol{A i}=\left[\begin{array}{cc}
\cos \theta & -\sin \theta \\
\sin \theta & \cos \theta
\end{array}\right]\binom{1}{0}=\binom{\cos \theta}{\sin \theta} \\
\end{gathered} Ai = [ cos θ sin θ − sin θ cos θ ] ( 0 1 ) = ( sin θ cos θ ) \quad
A j = [ cos θ − sin θ sin θ cos θ ] ( 0 1 ) = ( − sin θ cos θ ) = ( cos ( θ + π / 2 ) sin ( θ + π / 2 ) ) \begin{gathered}
\boldsymbol{A j}=\left[\begin{array}{cc}
\cos \theta & -\sin \theta \\
\sin \theta & \cos \theta
\end{array}\right]\binom{0}{1}=\binom{-\sin \theta}{\cos \theta}=\binom{\cos (\theta+\pi / 2)}{\sin (\theta+\pi / 2)}
\end{gathered} Aj = [ cos θ sin θ − sin θ cos θ ] ( 1 0 ) = ( cos θ − sin θ ) = ( sin ( θ + π /2 ) cos ( θ + π /2 ) ) 再结合下图, 可以看出, 旋转矩阵对单位向量 i 、 j \boldsymbol{i} 、 \boldsymbol{j} i 、 j 确实分别逆时针旋转了一个 θ \theta θ 角度。旋转后的两个向量 A i A i A i 和 A j A j A j 保持长度不变和夹角不变。或者说,向量 i → A i i \rightarrow A i i → A i 长度不变,角度逆时针增加了 θ \theta θ 度;向量 j → A j \boldsymbol{j} \rightarrow \boldsymbol{A} \boldsymbol{j} j → A j 长度不变, 同时同向角度增加了 θ \theta θ 度。
{width=600px}
然后, 我们考察旋转矩阵 A \boldsymbol{A} A 把任意向量 c \boldsymbol{c} c 变换到 A c \boldsymbol{A} \boldsymbol{c} A c 的情形。对于任意向量 c \boldsymbol{c} c , 我们知道,可以分解为单位向量的线性表示:
c = ( c 1 c 2 ) = c 1 ( 1 0 ) + c 2 ( 0 1 ) = c 1 i + c 2 j \boldsymbol{c}=\binom{c_1}{c_2}=c_1\binom{1}{0}+c_2\binom{0}{1}=c_1 \boldsymbol{i}+c_2 \boldsymbol{j} c = ( c 2 c 1 ) = c 1 ( 0 1 ) + c 2 ( 1 0 ) = c 1 i + c 2 j 那么, 旋转矩阵作用于向量 c \boldsymbol{c} c 的式子为
A c = A ( c 1 ( 1 0 ) + c 2 ( 0 1 ) ) = c 1 A ( 1 0 ) + c 2 A ( 0 1 ) = c 1 A i + c 2 A j \boldsymbol{A} \boldsymbol{c}=\boldsymbol{A}\left(c_1\binom{1}{0}+c_2\binom{0}{1}\right)=c_1 \boldsymbol{A}\binom{1}{0}+c_2 \boldsymbol{A}\binom{0}{1}=c_1 \boldsymbol{A} \boldsymbol{i}+c_2 \boldsymbol{A} \boldsymbol{j} A c = A ( c 1 ( 0 1 ) + c 2 ( 1 0 ) ) = c 1 A ( 0 1 ) + c 2 A ( 1 0 ) = c 1 A i + c 2 A j 对比上式 ,上面提到,一个向量乘以旋转矩阵A A A ,长度不变,方向选择θ \theta θ 角度,所以 分向量 c 1 i → c 1 A i c_1 i \rightarrow c_1 A i c 1 i → c 1 A i 长度不变, 角度逆时针增加了 θ \theta θ 度; 分向量 c 2 j → c 2 A j c_2 \boldsymbol{j} \rightarrow c_2 \boldsymbol{A} \boldsymbol{j} c 2 j → c 2 A j 长度不变, 同时同向角度增加了 θ \theta θ 度。那么, 向量的和 c 1 i + c 2 j → c 1 A i + c 2 A j c_1 \boldsymbol{i}+c_2 \boldsymbol{j} \rightarrow c_1 \boldsymbol{A} \boldsymbol{i}+c_2 \boldsymbol{A} \boldsymbol{j} c 1 i + c 2 j → c 1 A i + c 2 A j 长度不变, 角度逆时针增加了 θ \theta θ 度, 即 c → A c c \rightarrow A c c → A c 长度不变, 角度逆时针增加了 θ \theta θ 度, 如下图所示。
{width=600px}
因此,A B = C \boldsymbol{A B = C} AB = C 的一般几何意义, 就是矩阵 A \boldsymbol{A} A 把矩阵 B \boldsymbol{B} B 的数个列向量构成的几何图形进行旋转、缩放、镜像 等变换, 得到数个新向量, 这些新向量作为列向量组成一个新的矩阵 C \boldsymbol{C} C , 这个新矩阵 C \boldsymbol{C} C 会构成新的几何图形。
计算机图形学 计算机图形是在计算机屏幕上显示或活动的图像.计算机图形学的应用广泛,发展迅速.例如,计算机辅助设计(CAD)是许多工程技术的组成部分之一,在最简单的二维图形符号中,字母用于在屏幕上做标记.某些字母作为线框对象存储,其他有弯曲部分的字母还要将曲线的数学公式也存储进去.
例 图2-15中的大写字母 N 由 8 个点组成,计算机里存储这8个点的坐标到矩阵D D D 中.(只要存储这8个点,在计算机渲染时,把对应点自动连接起来,就显示出了字母N N N )
{width=300px}
{width=550px}
当描述这些对象的顶点被变换以后,他的图像也就跟着变换。
例 给定 A = [ 1 0.25 0 1 ] A=\left[\begin{array}{cc}1 & 0.25 \\ 0 & 1\end{array}\right] A = [ 1 0 0.25 1 ] 描述剪切变换 x ↦ A x x \mapsto A x x ↦ A x 对上例 中字母 N 的作用.
解 由矩阵乘法的定义,乘积 A D A D A D 的各列给出字母 N 各顶点的像.
{width=550px}
变换过的顶点画在图 2-16,同时还画上相应于原来图形中连线的线段.
图 2-16 中斜体的 N 看来有些太宽,为此,我们可以用倍乘变换使它变窄.
{width=300px}
例 先作如上例的剪切变换,然后再把 x x x 坐标乘以一个因子 0.75 ,求此复合变换的矩阵.
解 把每个点的 x x x 坐标乘以 0.75 的矩阵为
S = [ 0.75 0 0 1 ] S=\left[\begin{array}{ll}
0.75 & 0 \\
0 & 1
\end{array}\right] S = [ 0.75 0 0 1 ] 所以复合变换的矩阵是
S A = [ 0.75 0 0 1 ] [ 1 0.25 0 1 ] = [ 0.75 0.1875 0 1 ] S A=\left[\begin{array}{ll}
0.75 & 0 \\
0 & 1
\end{array}\right]\left[\begin{array}{ll}
1 & 0.25 \\
0 & 1
\end{array}\right]=\left[\begin{array}{ll}
0.75 & 0.1875 \\
0 & 1
\end{array}\right] S A = [ 0.75 0 0 1 ] [ 1 0 0.25 1 ] = [ 0.75 0 0.1875 1 ] 复合变换的结果如图 2-17 所示.
{width=300px}
总结 通过上面的例子,我们有2个小小结论:
①微观上看,1 − 8 1-8 1 − 8 个点可以看成八向量,乘以矩阵,相当于矩阵让这8个向量进行变形(旋转,缩放)。
②宏观上看,1 − 8 1-8 1 − 8 个点可以看成组成了一个图形,乘以矩阵,相当于矩阵让图形进行了变换(选择,缩放)
延伸阅读 反射变换 反射变换(Reflection)指的是图片对着 x 轴或者 y 轴做对称变换。对于图片上的点 ( x , y ) (x, y) ( x , y ) 在经过 x 轴的对称反射变换后,数学形式可以表示为:
x ′ = − x y ′ = y \begin{gathered}
x^{\prime}=-x \\
y^{\prime}=y
\end{gathered} x ′ = − x y ′ = y 表示成矩阵形式为:
[ x ′ y ′ ] = [ − 1 0 0 1 ] [ x y ] \left[\begin{array}{l}
x^{\prime} \\
y^{\prime}
\end{array}\right]=\left[\begin{array}{cc}
-1 & 0 \\
0 & 1
\end{array}\right]\left[\begin{array}{l}
x \\
y
\end{array}\right] [ x ′ y ′ ] = [ − 1 0 0 1 ] [ x y ] 同理可以得到 y 轴对称反射变换后的变换矩阵为:
[ x ′ y ′ ] = [ 1 0 0 − 1 ] [ x y ] \left[\begin{array}{l}
x^{\prime} \\
y^{\prime}
\end{array}\right]=\left[\begin{array}{cc}
1 & 0 \\
0 & -1
\end{array}\right]\left[\begin{array}{l}
x \\
y
\end{array}\right] [ x ′ y ′ ] = [ 1 0 0 − 1 ] [ x y ] 沿原点反射变换的变换矩阵为:
[ x ′ y ′ ] = [ − 1 0 0 − 1 ] [ x y ] \left[\begin{array}{l}
x^{\prime} \\
y^{\prime}
\end{array}\right]=\left[\begin{array}{cc}
-1 & 0 \\
0 & -1
\end{array}\right]\left[\begin{array}{l}
x \\
y
\end{array}\right] [ x ′ y ′ ] = [ − 1 0 0 − 1 ] [ x y ] 切变变换 切变变换(Shear),指的是在物理学上指的是两个距离很近,大小相等,方向相反的平行力作用于同一物体上所引起的形变。使用示意图可以更直观的去表示什么是切变。如图2.2所示,是图片在 x 轴方向上发生了切变。从图中我们可以看出所有点在 y 轴上的坐标不变,在 x 轴上的坐标满足:y = 0 y=0 y = 0 上的点, x 轴坐标不发生变化;y = 1 y=1 y = 1 上的点水平方向上移动了 a a a 个长度。因此对于任意一个点来说,水平方向上移动长度为 a y a y a y 。
{width=500px}
切变的矩阵变换可以写作:
[ x ′ y ′ ] = [ 1 a 0 1 ] [ x y ] \left[\begin{array}{l}
x^{\prime} \\
y^{\prime}
\end{array}\right]=\left[\begin{array}{ll}
1 & a \\
0 & 1
\end{array}\right]\left[\begin{array}{l}
x \\
y
\end{array}\right] [ x ′ y ′ ] = [ 1 0 a 1 ] [ x y ] 线性变换 对于任何一种变换如果可以写作:
x ′ = a x + b y y ′ = c x + d y \begin{aligned}
& x^{\prime}=a x+b y \\
& y^{\prime}=c x+d y
\end{aligned} x ′ = a x + b y y ′ = c x + d y 矩阵形式可以表示为:
[ x ′ y ′ ] = [ a b c d ] [ x y ] x ′ = M x \begin{array}{r}
{\left[\begin{array}{l}
x^{\prime} \\
y^{\prime}
\end{array}\right]=\left[\begin{array}{ll}
a & b \\
c & d
\end{array}\right]\left[\begin{array}{l}
x \\
y
\end{array}\right]} \\
x^{\prime}=M x
\end{array} [ x ′ y ′ ] = [ a c b d ] [ x y ] x ′ = M x 那么我们认为这种变换是线性变换(Linear transformation)。
齐次坐标 平移变换 平移变换(Translation)相比于以上的线性变换有特殊的地方。平移变换的数学形式为:
x ′ = x + t x y ′ = y + t y \begin{aligned}
& x^{\prime}=x+t_x \\
& y^{\prime}=y+t_y
\end{aligned} x ′ = x + t x y ′ = y + t y 这种数学表示不能写作线性变换的矩阵形式,只能记作:
[ x ′ y ′ ] = [ a b c d ] [ x y ] + [ t x t y ] \left[\begin{array}{l}
x^{\prime} \\
y^{\prime}
\end{array}\right]=\left[\begin{array}{ll}
a & b \\
c & d
\end{array}\right]\left[\begin{array}{l}
x \\
y
\end{array}\right]+\left[\begin{array}{l}
t_x \\
t_y
\end{array}\right] [ x ′ y ′ ] = [ a c b d ] [ x y ] + [ t x t y ] 说明平移操作不是线性变换。但是我们不希望把平移操作看作特殊变换,因此需要把这些变换统一起来,就引入了齐次坐标。
为了统一变换操作,我们引入一个新的维度。对于二维的点 ( x , y ) (x, y) ( x , y ) 我们可以增加一个维度,对于 2 维的点可以表示为 ( x , y , 1 ) , 2 (x, y, 1) , ~ 2 ( x , y , 1 ) , 2 维向量的 ( x , y , 0 ) (x, y, 0) ( x , y , 0 ) 。因此,一个点的平移可以用矩阵表示为:
[ x ′ y ′ w ′ ] = [ 1 0 t x 0 1 t y 0 0 1 ] [ x y 1 ] = [ x + t x y + t y 1 ] \left[\begin{array}{c}
x^{\prime} \\
y^{\prime} \\
w^{\prime}
\end{array}\right]=\left[\begin{array}{lll}
1 & 0 & t_x \\
0 & 1 & t_y \\
0 & 0 & 1
\end{array}\right]\left[\begin{array}{l}
x \\
y \\
1
\end{array}\right]=\left[\begin{array}{c}
x+t_x \\
y+t_y \\
1
\end{array}\right] x ′ y ′ w ′ = 1 0 0 0 1 0 t x t y 1 x y 1 = x + t x y + t y 1 为什么点补充维度大小为 1 ,但是向量补充维度大小为 0 ?
对于向量来说,平移变换不应该使向量的结果发生变化。因此补充维度为 0 的时候可以屏蔽平移带来的影响。
对于加入齐次坐标的点和向量满足:
向量 + 向量 = 向量
点-点 = 向量
点 + 向量 = 点
点 + 点 = 两个点中点
对引入齐次坐标的点的扩充定义如下:
( x y w ) = ( x / w y / w 1 ) , w ≠ 0 \left(\begin{array}{l}
x \\
y \\
w
\end{array}\right)=\left(\begin{array}{c}
x / w \\
y / w \\
1
\end{array}\right), w \neq 0 x y w = x / w y / w 1 , w = 0 仿射变换 仿射变换(Affine)包含线性变换与平移变换。可以用矩阵表示为:
[ x ′ y ′ ] = [ a b c d ] [ x y ] + [ t x t y ] \left[\begin{array}{l}
x^{\prime} \\
y^{\prime}
\end{array}\right]=\left[\begin{array}{ll}
a & b \\
c & d
\end{array}\right]\left[\begin{array}{l}
x \\
y
\end{array}\right]+\left[\begin{array}{c}
t_x \\
t_y
\end{array}\right] [ x ′ y ′ ] = [ a c b d ] [ x y ] + [ t x t y ] 使用齐次坐标后可以写作:
[ x ′ y ′ w ′ ] = [ a b t x c d t y 0 0 1 ] [ x y 1 ] = [ a x + b y + t x c x + d y + t y 1 ] \left[\begin{array}{c}
x^{\prime} \\
y^{\prime} \\
w^{\prime}
\end{array}\right]=\left[\begin{array}{lll}
a & b & t_x \\
c & d & t_y \\
0 & 0 & 1
\end{array}\right]\left[\begin{array}{l}
x \\
y \\
1
\end{array}\right]=\left[\begin{array}{c}
a x+b y+t_x \\
c x+d y+t_y \\
1
\end{array}\right] x ′ y ′ w ′ = a c 0 b d 0 t x t y 1 x y 1 = a x + b y + t x c x + d y + t y 1 逆变换 任何变换乘以他的逆矩阵A − 1 A^{-1} A − 1 表示的就是逆变换。
变换的组合与分解 可以用矩阵的乘法进行变换的组合(Transform compose ® { }^{\text {® }} R ◯ )。变换的先后顺序不同,变换的结果不同。矩阵和向量的乘法是从右到左依次相乘,从右到左依次应用变化。如果我们要依次应用变化 A 1 , A 2 , A 3 , ⋯ A 1, ~ A 2, ~ A 3, \cdots A 1 , A 2 , A 3 , ⋯ ,写成矩阵形式:
A n ( … A 2 ( A 1 ( x ) ) ) = A n … A 2 ⋅ A 1 ⋅ ( x y 1 ) A_n\left(\ldots A_2\left(A_1(x)\right)\right)=A_n \ldots A_2 \cdot A_1 \cdot\left(\begin{array}{l}
x \\
y \\
1
\end{array}\right) A n ( … A 2 ( A 1 ( x ) ) ) = A n … A 2 ⋅ A 1 ⋅ x y 1 根据矩阵运算的结合律,我们可以先把变换矩阵乘在一起,接下来把这个矩阵的乘积和向量相乘。可以用一个矩阵表示一个复杂的变换。
变换的分解 所有的复杂变换都可以分解成多个普通的变换。为了使某个图像沿着某个点 c c c 变换,我们可以分解为以下步骤:
1.把中心点 c c c 移动到原点
2.进行旋转;
3.把中心点 ( 0 , 0 ) (0,0) ( 0 , 0 ) 移动到原来的中心点
用变换矩阵表示为:
M t ( c ) ⋅ M r ( θ ) ⋅ M t ( − c ) M_t(c) \cdot M_r(\theta) \cdot M_t(-c) M t ( c ) ⋅ M r ( θ ) ⋅ M t ( − c )
三维变换 3 维变换可以类比于 2 维变换得到引入齐次坐标的点和向量, 3 维的点可以表示为 ( x , y , z , 1 ) T (x, y, z, 1) T ( x , y , z , 1 ) T , 3 维向量可以表示为 ( x , y , z , 0 ) T (x, y, z, 0) T ( x , y , z , 0 ) T 。当 w w w ≠ 0 \neq 0 = 0 的时候:( x , y , z , w ) = ( x / w , y / w , z / w , 1 ) (x, y, z, w)=(x / w, y / w, z / w, 1) ( x , y , z , w ) = ( x / w , y / w , z / w , 1 )
使用 4 × 4 4 \times 4 4 × 4 的矩阵来表示仿射变换:
( x ′ y ′ z ′ 1 ) = ( a b c t x d e f t y g h i t z 0 0 0 1 ) ⋅ ( x y z 1 ) \left(\begin{array}{l}
x^{\prime} \\
y^{\prime} \\
z^{\prime} \\
1
\end{array}\right)=\left(\begin{array}{llll}
a & b & c & t_x \\
d & e & f & t_y \\
g & h & i & t_z \\
0 & 0 & 0 & 1
\end{array}\right) \cdot\left(\begin{array}{l}
x \\
y \\
z \\
1
\end{array}\right) x ′ y ′ z ′ 1 = a d g 0 b e h 0 c f i 0 t x t y t z 1 ⋅ x y z 1 左上角表示是一个 3 × 3 3 \times 3 3 × 3 的线性变换
在仿射变换中的变换矩阵表示先线性变换在平移
1. 3 维变换中缩放变换
3 维变换中缩放变换的变换矩阵:
S ( s x , s y , s z ) = ( s x 0 0 0 0 s y 0 0 0 0 s z 0 0 0 0 1 ) S \left(s_x, s_y, s_z\right)=\left(\begin{array}{cccc}
s_x & 0 & 0 & 0 \\
0 & s_y & 0 & 0 \\
0 & 0 & s_z & 0 \\
0 & 0 & 0 & 1
\end{array}\right) S ( s x , s y , s z ) = s x 0 0 0 0 s y 0 0 0 0 s z 0 0 0 0 1 2.维变换中的平移变换
三维变换中平移变换的变换矩阵:
T ( t x , t y , t z ) = ( 1 0 0 t x 0 1 0 t y 0 0 1 t z 0 0 0 1 ) T \left(t_x, t_y, t_z\right)=\left(\begin{array}{cccc}
1 & 0 & 0 & t_x \\
0 & 1 & 0 & t_y \\
0 & 0 & 1 & t_z \\
0 & 0 & 0 & 1
\end{array}\right) T ( t x , t y , t z ) = 1 0 0 0 0 1 0 0 0 0 1 0 t x t y t z 1 3.三维变换中的旋转变换
当空间内的物体绕着 x x x 轴,y y y 轴或者 z z z 轴旋转的时候,变换矩阵为:
R x ( α ) = ( 1 0 0 0 0 cos α − sin α 0 0 sin α cos α 0 0 0 0 1 ) R y ( α ) = ( cos α 0 sin α 0 0 1 0 0 − sin α 0 cos α 0 0 0 0 1 ) \begin{aligned}
& R _x(\alpha)=\left(\begin{array}{cccc}
1 & 0 & 0 & 0 \\
0 & \cos \alpha & -\sin \alpha & 0 \\
0 & \sin \alpha & \cos \alpha & 0 \\
0 & 0 & 0 & 1
\end{array}\right) \\
& R _y(\alpha)=\left(\begin{array}{cccc}
\cos \alpha & 0 & \sin \alpha & 0 \\
0 & 1 & 0 & 0 \\
-\sin \alpha & 0 & \cos \alpha & 0 \\
0 & 0 & 0 & 1
\end{array}\right)
\end{aligned} R x ( α ) = 1 0 0 0 0 cos α sin α 0 0 − sin α cos α 0 0 0 0 1 R y ( α ) = cos α 0 − sin α 0 0 1 0 0 sin α 0 cos α 0 0 0 0 1 R z ( α ) = ( cos α − sin α 0 0 sin α cos α 0 0 0 0 1 0 0 0 0 1 ) R _z(\alpha)=\left(\begin{array}{cccc}
\cos \alpha & -\sin \alpha & 0 & 0 \\
\sin \alpha & \cos \alpha & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 0 & 0 & 1
\end{array}\right) R z ( α ) = cos α sin α 0 0 − sin α cos α 0 0 0 0 1 0 0 0 0 1 CSDN@搬砖怪
对于一般性的旋转问题,可以用简单的旋转描述复杂的旋转。用 x x x 轴,y y y 轴和 z z z 轴上的旋转来定义旋转:
R x y z ( α , β , γ ) = R x ( α ) R y ( β ) R z ( γ ) R _{x y z}(\alpha, \beta, \gamma)= R _x(\alpha) R _y(\beta) R _z(\gamma) R x yz ( α , β , γ ) = R x ( α ) R y ( β ) R z ( γ ) CSDN@恻砖怪
这三个角就被称作欧拉角(Euler angles)。
更多介绍请参考CSDN此处
三维旋转 { ( cos θ cos φ , cos θ sin φ , − sin θ ) T , ( − sin φ , cos φ , 0 ) T , ( sin θ cos φ , sin θ sin φ , cos θ ) T } \left\{(\cos \theta \cos \varphi, \cos \theta \sin \varphi,-\sin \theta)^{T},(-\sin \varphi, \cos \varphi, 0)^{T},(\sin \theta \cos \varphi, \sin \theta \sin \varphi, \cos \theta)^{T}\right\} { ( cos θ cos φ , cos θ sin φ , − sin θ ) T , ( − sin φ , cos φ , 0 ) T , ( sin θ cos φ , sin θ sin φ , cos θ ) T } ( 0 ⩽ θ ⩽ π , 0 ⩽ φ ⩽ 2 π ) (0 \leqslant \theta \leqslant \pi, 0 \leqslant \varphi \leqslant 2 \pi) ( 0 ⩽ θ ⩽ π , 0 ⩽ φ ⩽ 2 π ) 。把它们以 x , y , z x, ~ y, ~ z x , y , z 轴的顺序排列为列向量,所组成的三阶方阵为下面的方阵,这是一个任意方向旋转的矩阵:
[ cos θ cos φ − sin φ sin θ cos φ cos θ sin φ cos φ sin θ sin φ − sin θ 0 cos θ ] \left[\begin{array}{ccc}
\cos \theta \cos \varphi & -\sin \varphi & \sin \theta \cos \varphi \\
\cos \theta \sin \varphi & \cos \varphi & \sin \theta \sin \varphi \\
-\sin \theta & 0 & \cos \theta
\end{array}\right] cos θ cos φ cos θ sin φ − sin θ − sin φ cos φ 0 sin θ cos φ sin θ sin φ cos θ 在图 5-37 中,如果我们取定地球自转的旋转轴为 z z z 轴,北(上)方向为 z z z 轴方向(同时 xoy平面为赤道平面),那么 θ = 0 \theta=0 θ = 0 ,只有 φ \varphi φ 为变量。详细地说,x x x 轴上的 i i i 向量右旋了 φ \varphi φ 弧度,y y y 轴上的 j j j 向量右旋了 φ \varphi φ 弧度;z z z 轴上的 k k k 向量没有右旋,φ = 0 \varphi=0 φ = 0 。因此旋转矩阵简化为下面的方阵 A : A : A :
A = [ cos φ − sin φ 0 sin φ cos φ 0 0 0 1 ] A =\left[\begin{array}{ccc}
\cos \varphi & -\sin \varphi & 0 \\
\sin \varphi & \cos \varphi & 0 \\
0 & 0 & 1
\end{array}\right] A = cos φ sin φ 0 − sin φ cos φ 0 0 0 1
在计算 A A A (注意这是一个变矩阵)的特征值和特征向量之前,我们不妨先大概地猜测一下。大家知道,向不变或完全反转是特征向量的特性, 那么,地球绕着南北极轴转动的时候,明显不变的就是极轴了。极轴上的所有向量包括南极点和北极点都是特征向量。因为极轴上的向量大小在旋转前后也不变,所以其对应的特征值是 1 。一般情况下,其他的点都在动,没有更多的特征向量可以找到。
注意有几个例外。当 φ \varphi φ 取某些定值时还是有特征向量的。例如,当你旋转地球到 180 ∘ 180^{\circ} 18 0 ∘ 时,赤道平面上全都是特征向量,因为你把赤道平面上的所有的向量都掉转到反方向了。方向刚好相反但长度没有变化,因此特征值就是 -1 。旋转 180 ∘ 180^{\circ} 18 0 ∘ 的矩阵是 B B B :
B = [ cos φ − sin φ 0 sin φ cos φ 0 0 0 1 ] ∣ φ = π = [ − 1 0 0 0 − 1 0 0 0 1 ] B =\left.\left[\begin{array}{ccc}
\cos \varphi & -\sin \varphi & 0 \\
\sin \varphi & \cos \varphi & 0 \\
0 & 0 & 1
\end{array}\right]\right|_{\varphi=\pi}=\left[\begin{array}{ccc}
-1 & 0 & 0 \\
0 & -1 & 0 \\
0 & 0 & 1
\end{array}\right] B = cos φ sin φ 0 − sin φ cos φ 0 0 0 1 φ = π = − 1 0 0 0 − 1 0 0 0 1 别走,还有特征向量没找完呢。当你继续旋转地球到 360 ∘ 360^{\circ} 36 0 ∘ 时,奇迹发生了,地球上所有的点(所有的向量)都是特征向量了,因为旋转前和旋转后的点重合了。所有向量的方向和大小都没变,因此特征值是 1 。旋转 360 ∘ 360^{\circ} 36 0 ∘ 的矩阵 C C C 是:
C = [ cos φ − sin φ 0 sin φ cos φ 0 0 0 1 ] ∣ φ = 2 π = [ 1 0 0 0 1 0 0 0 1 ] = E C =\left.\left[\begin{array}{ccc}
\cos \varphi & -\sin \varphi & 0 \\
\sin \varphi & \cos \varphi & 0 \\
0 & 0 & 1
\end{array}\right]\right|_{\varphi=2 \pi}=\left[\begin{array}{lll}
1 & 0 & 0 \\
0 & 1 & 0 \\
0 & 0 & 1
\end{array}\right]= E C = cos φ sin φ 0 − sin φ cos φ 0 0 0 1 φ = 2 π = 1 0 0 0 1 0 0 0 1 = E 原来把所有向量整成特征向量的矩阵不是别人,正是大名鼎鼎的单位矩阵 E E E 。
前面的猜测毕竟是猜测,下面我们通过简单的计算来验证验证。
旋转矩阵的特征值和特征变量不难用特征多项式 ∣ A − λ E ∣ = 0 | A -\lambda E |=0 ∣ A − λ E ∣ = 0 求出,得到三个特征值:
λ 1 = 1 , λ 2 = cos φ + i sin φ , λ 3 = cos φ − i sin φ \lambda_1=1, \lambda_2=\cos \varphi+i \sin \varphi, \lambda_3=\cos \varphi-i \sin \varphi λ 1 = 1 , λ 2 = cos φ + i sin φ , λ 3 = cos φ − i sin φ 出现复数的特征值了。高中我们就学过,一个数乘以复数i i i 表示选择90度。这里我们先看看地球的旋转运动中只取实数的特征值及其特征向量是什么东东。
当 λ 1 = 1 \lambda_1=1 λ 1 = 1 时,有两种情况。一种情况是对于所有的旋转矩阵(旋转角度 φ \varphi φ 为任意值)地球上的特征向量为 k ( 0 0 1 ) k\left(\begin{array}{l}0 \\ 0 \\ 1\end{array}\right) k 0 0 1 ,这正是地球的自转极轴( z z z 轴),包括北极和南极点。不论旋转角度 φ \varphi φ 是多少,自转极轴一直是特征向量空间,空间里全是特征向量。另一种情况是对于旋转 0 或 360 ∘ 360^{\circ} 36 0 ∘ 的矩阵,也就是单位矩阵 E E E ,求得特征向量为 k 1 ( 1 0 0 ) + k 2 ( 0 1 0 ) + k 3 ( 0 0 1 ) k_1\left(\begin{array}{l}1 \\ 0 \\ 0\end{array}\right)+k_2\left(\begin{array}{l}0 \\ 1 \\ 0\end{array}\right)+k_3\left(\begin{array}{l}0 \\ 0 \\ 1\end{array}\right) k 1 1 0 0 + k 2 0 1 0 + k 3 0 0 1 ,这正是三维全空间。三维空间里的向量全部是特征向量,三维空间也就是特征向量空间。
当 λ 1 = − 1 \lambda_1=-1 λ 1 = − 1 时,旋转角度 φ = π \varphi=\pi φ = π ,地球上的特征向量为 k 1 ( 1 0 0 ) + k 2 ( 0 1 0 ) k_1\left(\begin{array}{l}1 \\ 0 \\ 0\end{array}\right)+k_2\left(\begin{array}{l}0 \\ 1 \\ 0\end{array}\right) k 1 1 0 0 + k 2 0 1 0 ,其张成的空间正是地球的赤道平面。赤道平面里的向量都是特征向量。