图形学基础——二维变换

简单的二维变换

  • 模型变换

  • 缩放矩阵

    等比缩放:
    [ x ′ y ′ ] = [ s 0 0 s ] [ x y ] = [ s x s y ] \begin{bmatrix} x^\prime \\ y^\prime \end{bmatrix} = \begin{bmatrix} s & 0 \\ 0 & s \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} = \begin{bmatrix} sx \\ sy \end{bmatrix} [xy]=[s00s][xy]=[sxsy]
    非等比缩放:
    [ x ′ y ′ ] = [ s x 0 0 s y ] [ x y ] = [ s x x s y y ] \begin{bmatrix} x^\prime \\ y^\prime \end{bmatrix} = \begin{bmatrix} s_x & 0 \\ 0 & s_y \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} = \begin{bmatrix} s_xx \\ s_yy \end{bmatrix} [xy]=[sx00sy][xy]=[sxxsyy]

  • 对称矩阵

  • 按照 x x x轴对称
    [ x ′ y ′ ] = [ − 1 0 0 1 ] [ x y ] = [ − x y ] \begin{bmatrix} x\prime \\ y^\prime \end{bmatrix} = \begin{bmatrix} -1 & 0 \\ 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} = \begin{bmatrix} -x \\ y \end{bmatrix} [xy]=[1001][xy]=[xy]

  • 错切矩阵

    错切就是在纵坐标不变的情况下,横坐标根据纵坐标做不同的平移,就是将一个正方形的高度不变的情况下,将其拉成一个平行四边形
    [ x ′ y ′ ] = [ 1 a 0 1 ] [ x y ] = [ x + a y y ] \begin{bmatrix} x^\prime \\ y^\prime \end{bmatrix} = \begin{bmatrix} 1 & a \\ 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} = \begin{bmatrix} x+ay \\ y \end{bmatrix} [xy]=[10a1][xy]=[x+ayy]

  • 旋转矩阵

    一般情况下,在没有任何其他规定时,我们默认旋转都是以坐标原点为中心,进行逆时针旋转,这对之后的计算有很大的影响。旋转矩阵如下:
    R θ = = [ cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ] R_\theta= = \begin{bmatrix} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{bmatrix} Rθ==[cosθsinθsinθcosθ]
    当一个变换能够写成 [ x ′ y ′ ] = [ a b c d ] [ x y ] \begin{bmatrix}x^\prime\\y^\prime\end{bmatrix}=\begin{bmatrix}a&b\\c&d\end{bmatrix}\begin{bmatrix}x\\y\end{bmatrix} [xy]=[acbd][xy],即 x ′ = M x \mathbf{x^\prime}=\mathbf{Mx} x=Mx时,我们称这个变换为线性变换。

  • 平移变换

    平移变换很特殊,他无法写成类似上面的线性变换的形式,只能如下表示 x ′ = x + t x y ′ = y + t y x^\prime=x+t_x \\y^\prime=y+t_y x=x+txy=y+ty [ x ′ y ′ ] = [ a b c d ] [ x y ] + [ t x t y ] \begin{bmatrix}x^\prime\\y^\prime\end{bmatrix}=\begin{bmatrix}a&b\\c&d\end{bmatrix}\begin{bmatrix}x\\y\end{bmatrix}+\begin{bmatrix}t_x\\t_y\end{bmatrix} [xy]=[acbd][xy]+[txty]的形式。因此,我们为了统一变换的表达式,引入了齐次坐标的概念。

  • 齐次坐标

    我们将二维的点或者向量增加一个维度
    ( x , y , 1 ) T (x,y,\color{red}1\color{back})^T (x,y,1)T向量 ( x , y , 0 ) T (x,y,\color{red}0\color{back})^T (x,y,0)T
    这样的话,我们就可以将平移变换写成如下的形式:
    [ x ′ x ′ w ′ ] = [ 1 0 t x 0 1 t y 0 0 1 ] ⋅ [ x y 1 ] = [ x + t x y + t y 1 ] \begin{bmatrix} x^\prime \\ x^\prime \\ w^\prime\end{bmatrix}=\begin{bmatrix}1&0&t_x\\0&1&t_y\\0&0&1\end{bmatrix}\cdot\begin{bmatrix}x\\y\\1\end{bmatrix}=\begin{bmatrix}x+t_x\\y+t_y\\1\end{bmatrix} xxw=100010txty1xy1=x+txy+ty1
    这里为什么点是加1,而向量是加0呢,因为向量具有平移不变性,我们将向量通过平移变换后,结果仍然是原来的向量,即
    [ x ′ x ′ w ′ ] = [ 1 0 t x 0 1 t y 0 0 1 ] ⋅ [ x y 0 ] = [ x y 0 ] \begin{bmatrix} x^\prime \\ x^\prime \\ w^\prime\end{bmatrix}=\begin{bmatrix}1&0&t_x\\0&1&t_y\\0&0&1\end{bmatrix}\cdot\begin{bmatrix}x\\y\\0\end{bmatrix}=\begin{bmatrix}x\\y\\0\end{bmatrix} xxw=100010txty1xy0=xy0
    更深层次的理解是:
    两个向量相加,结果仍是向量:向量 + 向量 = 向量
    点与点相减,最后的结果是从起点指向终点的向量:点 - 点 = 向量
    点加向量,其实就是将这个点朝着向量的方向移动,结果依然是点:点 + 向量 = 点
    最后点加点的含义其实是两个点连线的中点,如果我们认为任意一个点 ( x , y , w ) T (x,y,w)^T (x,y,w)T在二维中是 ( x / w , y / w , 1 ) T , w ≠ 0 (x/w,y/w,1)^T,w\neq0 (x/w,y/w,1)T,w=0,那么点+点最后的结果在齐次坐标下就是两个点的中点。
    那么,上述的所有变化(我们称之为仿射变换),在齐次坐标下就可以写成如下形式: [ x ′ y ′ 1 ] = [ a b t x c d t y 0 0 1 ] [ x y 1 ] \begin{bmatrix}x^\prime\\y^\prime\\1\end{bmatrix}=\begin{bmatrix}a&b&t_x\\c&d&t_y\\0&0&1\end{bmatrix}\begin{bmatrix}x\\y\\1\end{bmatrix} xy1=ac0bd0txty1xy1
    缩放矩阵: S ( s x , s y ) = [ s x 0 0 0 s y 0 0 0 1 ] \mathbf{S}(s_x,s_y) = \begin{bmatrix} s_x & 0 &0\\ 0 & s_y &0\\0&0&1\end{bmatrix} S(sx,sy)=sx000sy0001
    旋转矩阵: R ( α ) = [ cos ⁡ α − sin ⁡ α 0 sin ⁡ α cos ⁡ α 0 0 0 1 ] \mathbf{R}(\alpha) = \begin{bmatrix} \cos\alpha& -\sin\alpha&0\\ \sin\alpha &\cos\alpha &0\\0&0&1\end{bmatrix} R(α)=cosαsinα0sinαcosα0001
    平移矩阵: T ( t x , t y ) = [ 1 0 t x 0 1 t y 0 0 1 ] \mathbf{T}(t_x,t_y) = \begin{bmatrix} 1 & 0 &t_x\\ 0 & 1 &t_y\\0&0&1\end{bmatrix} T(tx,ty)=100010txty1
    在仿射变换下,矩阵的最后一行都是 ( 0 , 0 , 1 ) (0,0,1) (0,0,1),但是在其他的情况下,最后一行是有意义的,这点要注意。

  • 逆变换

    逆变换就是将变换反过来操作一遍,在线性代数中,逆变换就是乘以变换的逆矩阵。

  • 平移与旋转变换的顺序

    当进行复杂的变换时,我们先进行旋转变换,再进行平移变换,不然结果会不一样。通过矩阵的乘法,我们可以知道,矩阵的乘法是不满足交换律的,所以变换的顺序不一样时,结果就会不一样。因为旋转时,我们默认是以原点为圆心进行旋转,如果先平移,那么就会与原先旋转的原点不一样了,结果就会不对。
    所以,当我们需要将一个点或者向量按照非原点进行旋转时,我们可以先将这个点或者向量平移到原点,再进行旋转,再将旋转完的点或者向量进行之前平移的逆变换。
    矩阵形式可以写成
    T ( c ) ⋅ R ( α ) ⋅ T ( − c ) \mathbf{T(c)}\cdot\mathbf{R(\alpha)}\cdot\mathbf{T(-c)} T(c)R(α)T(c)
    注意矩阵是以左乘的形式进行计算的,所以这里的操作是先将向量移动 − c -c c 的距离到原点,再进行旋转,最后再移动 c c c 的距离到原来的位置。

猜你喜欢

转载自blog.csdn.net/bjygn/article/details/125101989