注意,以下都是矩阵左乘向量!

Transformation 的基本元素

我们均假设点的坐标为 (x,y)(x,y),Transform 后的点为 (x,y)(x',y')

  • Rotation

    假设旋转角度为 θ\theta,则

    [xy]=R(θ)[xy] \begin{bmatrix}x' \\ y'\end{bmatrix}=R(\theta)\begin{bmatrix}x \\ y\end{bmatrix}
  • Translation

    可以表示为向量加法:

    [xy]=[xy]+[txty] \begin{bmatrix}x'\\y'\end{bmatrix}=\begin{bmatrix}x'\\y'\end{bmatrix}+\begin{bmatrix}t_x\\ t_y\end{bmatrix}
  • Scaling

    假设关于某个点放大,即 (xcx)s(xcx)(x'-c_x)\gets s(x-c_x),(我们这里先忽略 cxc_x)有

    [xy]=[sx00sy][xy] \begin{bmatrix}x'\\y'\end{bmatrix}=\begin{bmatrix}s_x & 0\\0 & s_y\end{bmatrix}\begin{bmatrix}x\\y\end{bmatrix}
  • Reflection

    即关于 x,yx,y-axis 进行反转

    [xy]=B(1,0,1)[xy] \begin{bmatrix}x'\\y'\end{bmatrix}=B(1,0,-1)\begin{bmatrix}x\\y\end{bmatrix}
  • Shear

    transformed shape appears as if the object were composed of internal layers that had been caused to slide over each other

    [xy]=[1a01][xy][xy]=[10b1][xy] \begin{bmatrix}x'\\y'\end{bmatrix}=\begin{bmatrix}1 & a \\ 0 & 1\end{bmatrix}\begin{bmatrix}x\\y\end{bmatrix} \\ \begin{bmatrix}x'\\y'\end{bmatrix}=\begin{bmatrix}1 & 0 \\ b & 1\end{bmatrix}\begin{bmatrix}x\\y\end{bmatrix}

Homogeneous Coordinates

把二维的点 (x,y)(x,y) 拓展到三维 (xh,yh,h)(x_h, y_h, h) 使得 xh=xh,yh=yhxh=x_h, yh=y_h. 则称 (xh,yh,h)(x_h, y_h, h)(x,y)(x,y) 的 Homogeneous Coordinates.

故在三维空间里,二维点 (x,y)(x,y) 对应的是三维空间里的 z=1z=1 平面. 所有和 (x,y)(x,y) 等价的 Homogeneous Coordinates 构成经过 (0,0,0),(x,y,1)(0,0,0), (x,y,1) 的直线.

把二维点的坐标表示为三维有另一个好处:我们可以把 translation 也表示成 Matrix Multiplication 的形式了.

  • Translation

    可以表示为矩阵乘法:

    [xy1]=[10tx01ty001]+[xy1] \begin{bmatrix}x'\\y'\\1\end{bmatrix}=\begin{bmatrix}1 & 0 & t_x\\0 & 1 & t_y\\0 & 0 & 1\end{bmatrix}+\begin{bmatrix}x\\ y\\ 1\end{bmatrix}
  • Rotation

    [xy1]=[cosϕsinϕ0sinϕcosϕ0001]+[xy1] \begin{bmatrix}x'\\y'\\1\end{bmatrix}=\begin{bmatrix}\cos\phi & \sin\phi & 0\\ -\sin\phi & \cos\phi & 0\\0 & 0 & 1\end{bmatrix}+\begin{bmatrix}x\\ y\\ 1\end{bmatrix}
  • Scaling

    如果是关于 (cx,cy)(c_x,c_y) 进行放大,那么我们首先将平移放缩中心到原点、放缩、再平移回去:

    [xy1]=[sx000sy0001]+[xy1] \begin{bmatrix}x'\\y'\\1\end{bmatrix}=\begin{bmatrix}s_x & 0 & 0\\0 & s_y & 0\\0 & 0 & 1\end{bmatrix}+\begin{bmatrix}x\\ y\\ 1\end{bmatrix}
  • Reflection

  • Shear

    [xy1]=[1a0010001][xy1][xy1]=[100b10001][xy1] \begin{bmatrix}x'\\y'\\1\end{bmatrix}=\begin{bmatrix}1 & a & 0\\ 0 & 1 & 0\\ 0&0&1\end{bmatrix}\begin{bmatrix}x\\y\\1\end{bmatrix} \\ \begin{bmatrix}x'\\y'\\1\end{bmatrix}=\begin{bmatrix}1 & 0 & 0\\ b & 1&0\\0&0&1\end{bmatrix}\begin{bmatrix}x\\y\\1\end{bmatrix}

Affine Transformation

不管有多少矩阵,我们发现其都可以写成如下形式:

[xy1]=[abcdef001][xy1] \begin{bmatrix}x'\\y'\\1\end{bmatrix}=\begin{bmatrix}a &b &c \\ d & e & f\\0&0&1\end{bmatrix}\begin{bmatrix}x\\y\\1\end{bmatrix}