2D变换

  • 缩放
\[
\begin{aligned}x'=Sx\\
y'=Sy\end{aligned}
\] \[
(\begin{matrix} x' \\y'\end{matrix}) =
(\begin{matrix} S & 0 \\ 0& S \end{matrix})
(\begin{matrix} x \\ y \end{matrix})
\]
  • 反转
\[
\begin{aligned}x' = -x \\ y' = y\end{aligned}\\
(\begin{matrix} x' \\ y' \end{matrix}) =
(\begin{matrix} -1 & 0 \\ 0 & 1 \end{matrix})
(\begin{matrix} x \\ y\end{matrix})
\]
  • 切变
\[
(\begin{matrix} x' \\ y' \end{matrix}) =
(\begin{matrix} 1 & a \\ 0 & 1 \end{matrix})
(\begin{matrix} x \\ y\end{matrix})
\]
  • 旋转
\[
\begin{aligned}R\Theta\end{aligned} =
(\begin{matrix} \sin(\Theta) & -\sin(\Theta) \\ \sin(\Theta) & \cos(\Theta) \end{matrix})\\
\] \[
\begin{aligned}-R\Theta\end{aligned} =
(\begin{matrix} \sin(\Theta) & \sin(\Theta) \\ -\sin(\Theta) & \cos(\Theta) \end{matrix})
\]

总结

\[
\begin{aligned}
x^{\prime} &=a x+b y \\
y^{\prime} &=c x+d 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] \\
\\
\mathbf{x}^{\prime} &=\mathbf{M} \mathbf{x}
\end{aligned}
\]

​ 对于一个2d图形来说,对他进行操作,可以表示为对该图形的每个点乘以一个矩阵的形式

怎么用二维向量表示二维中的平移操作?

\[
\begin{array}{l}
x^{\prime}=x+t_{x} \\
y^{\prime}=y+t_{y}
\end{array}
\]

如果直接表示为矩阵的形式,会出现什么样的问题呢?

\[
\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]
\]

​ 这样虽然也可以表示,但是与我们之前总结的结论不相符,同样作为二维的简单变换,出现不一样的表示方式,不利于后续对复杂变换的表达

解决办法--引入齐次坐标方程

引入齐次坐标的定义

​ 对于任意二维的点,我们表示为

\[
\text { - 2D point }=(x, y, 1)^{\top}
\]

​ 对于任意二维的向量,我们表示为

\[
\text { - 2D vector }=(\mathbf{x}, \mathbf{y}, 0)^{\top}
\]

​ 同时对于2点相减

\[
\text (x1, y1, 1)^{\top}-(x2, y2, 1)^{\top}=(x1-s2, y1-y2, 0)^{\top}
\]

​ 通过引入第三维的一个值,我们就能把平移表示为

\[
\left(\begin{array}{c}
x^{\prime} \\
y^{\prime} \\
w^{\prime}
\end{array}\right)=\left(\begin{array}{ccc}
1 & 0 & t_{x} \\
0 & 1 & t_{y} \\
0 & 0 & 1
\end{array}\right) \cdot\left(\begin{array}{l}
x \\
y \\
1
\end{array}\right)=\left(\begin{array}{c}
x+t_{x} \\
y+t_{y} \\
1
\end{array}\right)
\]

​ 对于原来的平移加变换的符合操作,我们同样可以用齐次坐标很简洁明了的表现出来

\[
\left(\begin{array}{l}
x^{\prime} \\
y^{\prime}
\end{array}\right)=\left(\begin{array}{ll}
a & b \\
c & d
\end{array}\right) \cdot\left(\begin{array}{l}
x \\
y
\end{array}\right)+\left(\begin{array}{l}
t_{x} \\
t_{y}
\end{array}\right)
\] \[
\left(\begin{array}{l}
x^{\prime} \\
y^{\prime} \\
1
\end{array}\right)=\left(\begin{array}{lll}
a & b & t_{x} \\
c & d & t_{y} \\
0 & 0 & 1
\end{array}\right) \cdot\left(\begin{array}{l}
x \\
y \\
1
\end{array}\right)
\]

​ 同样的,对于之前的缩放,选择,平移,我们分别都可以改写为

\[
\mathbf{S}\left(s_{x}, s_{y}\right)=\left(\begin{array}{ccc}
s_{x} & 0 & 0 \\
0 & s_{y} & 0 \\
0 & 0 & 1
\end{array}\right)
\] \[
\mathbf{R}(\alpha)=\left(\begin{array}{ccc}
\cos \alpha & -\sin \alpha & 0 \\
\sin \alpha & \cos \alpha & 0 \\
0 & 0 & 1
\end{array}\right)
\] \[
\mathbf{T}\left(t_{x}, t_{y}\right)=\left(\begin{array}{ccc}
1 & 0 & t_{x} \\
0 & 1 & t_{y} \\
0 & 0 & 1
\end{array}\right)
\]

思考

​ 从原点进行任意角度的旋转,在实际的使用之中,并不是那么的多,相反的,在进行图像处理的最初步骤,我们常常是需要先将model进行归一化处理,换而言之,我们怎么把任意角度的物体,给旋转为“正”呢?

​ 这其实是很简单的,因为旋转本质上是对图像的所有点都乘以了一个矩阵,在线性代数中,我们都学过,矩阵和矩阵的逆相乘,为单位矩阵,只要我们求出该矩阵的逆矩阵就能把图像还原

那么怎么求出该矩阵的逆呢?

​ 因为旋转矩阵是一个正交矩阵,所以,只需要将原矩阵进行转置,就可以得到该矩阵的逆了

在矩阵的运算之中,还有一些东西是我们需要注意的

矩阵的运算的不满足交换律的,具体表现为

\[
R_{45} \cdot T_{(1,0)} \neq T_{(1,0)} \cdot R_{45}
\]

​ 从矩阵的运算规则上,我们同样也可以得出,矩阵的运算是不满足交换律的,那么,对于计算机之中,我们因如何安排我们的变换矩阵进行运算,从而得到我们想要的结果呢?

\[
T_{(1,0)} \cdot R_{45}\left[\begin{array}{l}
x \\
y \\
1
\end{array}\right]=\left[\begin{array}{lll}
1 & 0 & 1 \\
0 & 1 & 0 \\
0 & 0 & 1
\end{array}\right]\left[\begin{array}{ccc}
\cos 45^{\circ} & -\sin 45^{\circ} & 0 \\
\sin 45^{\circ} & \cos 45^{\circ} & 0 \\
0 & 0 & 1
\end{array}\right]\left[\begin{array}{l}
x \\
y \\
1
\end{array}\right]
\]

​ 可以从公式看出对于多个变换矩阵,是从该向量左边的第一个矩阵开始应用,然后重复此步骤:

\[
A_{n}\left(\ldots A_{2}\left(A_{1}(\mathbf{x})\right)\right)=\mathbf{A}_{n} \cdots \mathbf{A}_{2} \cdot \mathbf{A}_{1} \cdot\left(\begin{array}{l}
x \\
y \\
1
\end{array}\right)
\]

同时,我们应该注意,矩阵有结合律,所以,我们可以将这个多个简单的变化,写成一个由简单变换的矩阵结合而成的复杂变换矩阵

​ 我们也可以这样看,一个复杂的变化,我们可以理解为一些简单变换的结合

eg要如何表示矩阵绕任意一点旋转呢?

\[
\mathbf{T}(\mathbf{c}) \cdot \mathbf{R}(\alpha) \cdot \mathbf{T}(-\mathbf{c})
\]

通过这样的分解,我们就可以得到绕任意一点旋转所需要的复杂矩阵.可以看出,复杂矩阵的每一步并不复杂。

3D中的齐次坐标

​ 3d中的齐次坐标类似于2D,如下:

\[
- 3D point =(\mathbf{x}, \mathbf{y}, \mathbf{z}, 1)^{\top}\\
- 3D vector =(\mathbf{x}, \mathbf{y}, \mathbf{z}, \mathbf{0})^{\top}
\]

​ 如果w不为1的情况如何处理?

\[
(x, y, z, w)(w !=0)
\] \[
(\mathrm{x} / \mathrm{w}, \mathrm{y} / \mathrm{w}, \mathrm{z} / \mathrm{w})
\]

​ 同样的,对于三维空间中的点,进行复杂的操作

\[
\left(\begin{array}{l}
x^{\prime} \\
y^{\prime} \\
z^{\prime} \\
1
\end{array}\right)=\left(\begin{array}{cccc}
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)
\]

Thanks you

图片来源:闫令琪老师的games101计算机图形学入门课程,欢迎大家前去了解