本文将简单介绍二维几何变换,包括二维平移变换、二维旋转变换、二维缩放变换、二维仿射变换的变换过程和矩阵计算。

1 基本变换

二维几何基本变换包括平移、旋转、缩放。

1.1 平移

平移指的是将物体沿着某直线路径从一个坐标位置移动到另一个坐标位置,不产生形变的刚体变换。

计算几何 – 二维几何变换,二维平移、旋转、缩放、仿射变换-StubbornHuang Blog

假设原始坐标位置为(x,y),平移距离为t_{x}t_{y},新位置为(x^{\prime},y^{\prime}),则x^{\prime}=x+t_x,y^{\prime}=y+t_y

使用矩阵表示,则令

\vec{P}=\begin{pmatrix}x\\y\end{pmatrix}\quad\vec{P^{\prime}}=\begin{pmatrix}x^{\prime}\\y^{\prime}\end{pmatrix}\quad\vec{T}=\begin{pmatrix}t_x\\t_y\end{pmatrix}

则:

\vec{P^{\prime}}=\vec{P}+\vec{T}

1.2 旋转

旋转就是以某个点为旋转中心,将对象上的各个点(x,y)围绕旋转中心转动一个逆时针角度\theta,变成一个新坐标(x^{\prime},y^{\prime})的变换。

1.2.1 绕原点旋转

计算几何 – 二维几何变换,二维平移、旋转、缩放、仿射变换-StubbornHuang Blog

根据上图,

\begin{gathered}
x^{\prime}=rcos(\varphi+\theta)=rcos\varphi cos\theta-rsin\varphi sin\theta \\
y'=rsin(\varphi+\theta)=rsin\varphi cos\theta+rcos\varphi sin\theta \\
\because x=rcos\varphi,y=rsin\varphi \\
\therefore x^{\prime}=xcos\theta-ysin\theta\quad y^{\prime}=xsin\theta+ycos\theta
\end{gathered}

转成矩阵形式,令

\vec{R}=\begin{pmatrix}cos\theta&-sin\theta\\-sin\theta&cos\theta\end{pmatrix}

\overrightarrow{P'}=\vec{R}\cdot\vec{P}

1.2.2 绕任意点旋转

绕任意点旋转其实和绕原点旋转差不多,不过还是有区别。

假设旋转中心为(x_{r},y_{r})

  • 首先需要将坐标系原点平移到(x_{r},y_{r})
  • 然后在新的坐标系下做上一小节的旋转变换
  • 最后将坐标原点平移回原坐标

最后变换公式如下:

\begin{aligned}x^{\prime}&=x_r+(x-x_r)cos\theta-(y-y_r)sin\theta\\y^{\prime}&=y_r+(x-x_r)sin\theta+(y-y_r)cos\theta\end{aligned}

1.3 缩放

缩放就是将对象按比例因子S_{x}S_{y}放大或者缩小的变换。

计算几何 – 二维几何变换,二维平移、旋转、缩放、仿射变换-StubbornHuang Blog

根据上图,

x^{\prime}=x\cdot S_x\quad y^{\prime}=y\cdot S_y

\vec{S}=\begin{pmatrix}S_x&0\\0&S_y\end{pmatrix}

\vec{P'}=\vec{S}\cdot\vec{P}

不过缩放有特殊情况:

  • S_{y} = -1,S_{x} = 1时,按x轴反射
  • S_{y} = 1,S_{x} = -1时,按y轴反射
  • S_{y} = -1,S_{x} = -1时,按原点(0,0)反射

2 二维变换矩阵

上述的每个基本变换都可以表示为普通矩阵形式:

\vec{P^{\prime}}=\vec{M}_1\vec{P}+\vec{M}_2

2.1 平移

2\times2矩阵扩充为3\times3矩阵,将二维几何变换的乘法和平移项组合成单一矩阵表示平移

\begin{gathered}\begin{pmatrix}x^{\prime}\\y^{\prime}\\1\end{pmatrix}=\begin{pmatrix}1&0&t_x\\0&1&t_y\\0&0&1\end{pmatrix}\cdot\begin{pmatrix}x\\y\\1\end{pmatrix}\\\overrightarrow{P^{\prime}}=\vec{T}(t_x,t_y)\vec{P}\end{gathered}

2.2 旋转

绕原点的旋转

\begin{gathered}\begin{pmatrix}x^{\prime}\\y^{\prime}\\1\end{pmatrix}=\begin{pmatrix}cos\theta&-sin\theta&0\\sin\theta&cos\theta&0\\0&0&1\end{pmatrix}\cdot\begin{pmatrix}x\\y\\1\end{pmatrix}\\\overrightarrow{P^{\prime}}=\vec{R}(\theta)\vec{P}\end{gathered}

2.3 缩放

相对于坐标原点的缩放

\begin{gathered}
\begin{pmatrix}x^\prime\\y^\prime\\1\end{pmatrix} =\begin{pmatrix}S_x&0&0\\0&S_y&0\\0&0&1\end{pmatrix}\cdot\begin{pmatrix}x\\y\\1\end{pmatrix} \\
\overrightarrow{P'}=\vec{S}(S_x,S_y)\vec{P}
\end{gathered}

3 复合变换

3.1 平移

假设坐标位置P进行两次连续的平移变换,平移向量为(t_{x1},t_{y1})(t_{x1},t_{y1}),则变换后的坐标位置P^{\prime}

\begin{gathered}
\overrightarrow{P^{\prime}} =\vec{T}(t_{x2},t_{y2})\vec{T}(t_{x1},t_{y1})\vec{P}=\vec{T}(t_{x2},t_{y2})\cdot\vec{T}(t_{x1},t_{y1})\cdot\vec{P} \\
\vec{T}(t_{x2},t_{y2})\cdot\vec{T}(t_{x1},t_{y1})=\vec{T}(t_{x1}+t_{x2},t_{y1}+t_{y2}) \\
\therefore\overrightarrow{P^{\prime}}=\vec{T}(t_{x1}+t_{x2},t_{y1}+t_{y2})\cdot\vec{P}
\end{gathered}

3.2 旋转

和平移一样,如果连续进行两次旋转变换,则变换后的坐标位置P^{\prime}

\begin{gathered}
\text{L} \\
P^{^{\prime}}=\vec{R}(\theta_2)\vec{R}(\theta_1)\cdot\vec{P}=\vec{R}(\theta_2)\cdot\vec{R}(\theta_1)\cdot\vec{P} \\
\vec{R}(\theta_2)\cdot\vec{R}(\theta_1)=\vec{R}(\theta_1+\theta_2) \\
\therefore\vec{P^{\prime}}=\vec{R}(\theta_2+\theta_1)\cdot\vec{P}
\end{gathered}

3.3 缩放

如果连续进行两次缩放变化,则变换后的坐标位置P^{\prime}

\vec{S}(S_{x2}\cdot S_{y2})\cdot\vec{S}(S_{x1}\cdot S_{y1})=\vec{S}(S_{x1}\cdot S_{x2},S_{y1}\cdot S_{y2})

3.4 绕任意指定的旋转位置旋转的复合变换矩阵

计算几何 – 二维几何变换,二维平移、旋转、缩放、仿射变换-StubbornHuang Blog

根据上图

\begin{pmatrix}1&0&x_r\\0&1&y_r\\0&0&1\end{pmatrix}\begin{pmatrix}cos\theta&-sin\theta&0\\sin\theta&cos\theta&0\\0&0&1\end{pmatrix}\begin{pmatrix}1&0&-x_r\\0&1&-y_r\\0&0&1\end{pmatrix}=\begin{pmatrix}cos\theta&-sin\theta&x_r(1-cos\theta)+y_rsin\theta\\sin\theta&cos\theta&y_r(1-cos\theta)-x_rsin\theta\\0&0&1\end{pmatrix}

4 仿射变换

仿射变换公式如下:

\begin{aligned}x^{\prime}&=a_{xx}x+a_{xy}y+b_x\\y^{\prime}&=a_{yx}x+a_{yy}y+b_y\end{aligned}

仿射变换具有平行线转换到平行线,有限点映射到有限点的特征。平移,旋转,缩放,反射,错切是二维仿射变换的特例。

参考链接