zoukankan      html  css  js  c++  java
  • 线性变换

    什么是线性变换?

    假设有一数学函数(f),使得三维向量(vec v=(x,y,z)),有(f(vec v) = f(x, y, z) = (x',y',z'))。那么,如果(f)满足:

    1. (f(vec u + vec v) = f(vec u) + f(vec v))
    2. (f(k vec v) = kf(vec v))

    那么,称(f)为线性变换。

    线性变换的矩阵表示

    [egin{align*} f(vec v) &= f(x vec i + y vec j + z vec k) \ &= f(x vec i) + f(y vec j) + f(z vec k) \ &= xf(vec i) + yf(vec j) + zf(vec k) \ &= [x, y, z] cdot egin{bmatrix} f(vec i) \ f(vec j) \ f(vec k) end{bmatrix} end{align*} ]

    缩放变换

    易知,缩放变换(S(vec v) = S(x, y, z) = (s_x x, s_y y, s_z z))。那么,我们尝试证明一下它是线性变换:

    [egin{align*} S(vec u + vec v) &= S(u_x+v_x, u_y+v_y, u_z+v_z) \ &= (s_x(u_x+v_x), s_y(u_y+v_y), s_z(u_z+v_z)) \ &= (s_xu_x + s_xv_x, s_yu_y + s_yv_y, s_zu_z + s_zv_z) \ &= (s_xu_x, s_yu_y, s_zu_z) + (s_xv_x, s_yv_y, s_zv_z) \ &= S(vec u) + S(vec v) end{align*} ]

    [egin{align*} S(kvec v) &= S(kv_x, kv_y, kv_z) \ &= (ks_xv_x, ks_yv_y, ks_zv_z) \ &= k(s_xv_x, s_yv_y, s_zv_z) \ &= kS(vec v) end{align*} ]

    综上,我们证明了缩放变换是线性变换。由之前线性变换的矩阵表示,我们可以推导缩放变换的矩阵表示为

    [egin{bmatrix} S(vec i) \ S(vec j) \ S(vec k) end{bmatrix} = egin{bmatrix} s_x & 0 & 0 \ 0 & s_y & 0 \ 0 & 0 & s_z end{bmatrix} ]

    旋转变换

    我们定义旋转变换为将一个向量(vec v)绕任意轴(vec n)顺时针旋转( heta)角度,如图所示:

    由图可知,我们要求的就是将向量(vec v)绕向量(vec n)旋转( heta)角度后得到的(vec v')。首先,我们注意到在旋转过程中,与旋转轴平行的向量是不参与旋转过程的,只有与旋转轴垂直的向量在真正旋转。因此可以将向量(vec v)分解为与(vec n)平行的向量(vec v_parallel)和垂直的向量(vec v_perp)。即:

    [vec v = vec v_parallel + vec v_perp ]

    那么

    [vec v' = vec v_parallel + vec v'_perp ]

    其中,平行向量(vec v_parallel)是向量(vec v)在旋转轴(vec n)上的投影。这里假定,旋转轴向量(vec n)是归一化过的,即单位向量。由向量投影的定义,可得到

    [vec v_parallel = (vec v cdot vec n) vec n ]

    进而可得

    [vec v_perp = vec v - vec v_parallel = vec v - (vec v cdot vec n) vec n ]

    接下来,我们只要求得旋转后的(vec v'_perp)即可。注意到已知的(vec v_perp),且这两个向量都位于同一个圆的旋转平面上,因此只要再得到一个垂直于(vec v_perp)的向量(vec w),且向量(vec w)与这两个向量共面,就可以通过旋转角度( heta)算出向量(vec v'_perp)了:

    [vec v'_perp = vec v_perp cdot cos heta + vec w cdot sin heta ]

    那么,怎样的(vec w)是满足以上条件的呢?注意到向量的叉积的几何意义:两向量的叉积后得到的向量与这两个向量是垂直的。所以,我们令

    [vec w = frac{|vec v_perp|}{|vec n imes vec v|} cdot (vec n imes vec v) ]

    向量前面的系数是为了让向量的模与(vec v_perp)相等。这样就求出了满足条件的(vec w)。特别地,由向量叉积的定义,可以将上式简化为

    [vec w = frac{|vec v_perp|}{|vec n| |vec v| sin heta} cdot (vec n imes vec v) ]

    由图可知,(|vec v_perp| = |vec v| sin heta),而向量(vec n)是单位向量,所以得到:

    [vec w = vec n imes vec v ]

    综合以上若干等式,求出最终的(vec v')

    [vec v' = (vec v cdot vec n) vec n + (vec v - (vec v cdot vec n) vec n)cos heta + (vec n imes vec v)sin heta ]

    回到线性变换的定义来,旋转变换(R(vec v) = R(x, y, z))。将其代入上式,可以得到

    [R(x,y,z) = (r_{11}x + r_{21}y + r_{31}z, r_{12}x + r_{22}y + r_{32}z, r_{13}x + r_{23}y + r_{33}z) ]

    根据线性变换的定义,容易证明旋转变换是一种线性变换。那么,旋转变换的矩阵表示为:

    [egin{bmatrix} R(vec i) \ R(vec j) \ R(vec k) end{bmatrix} = egin{bmatrix} r_{11} & r_{12} & r_{13} \ r_{21} & r_{22} & r_{23} \ r_{31} & r_{32} & r_{33} end{bmatrix} = egin{bmatrix} c + (1 - c)x^2 & (1-c)xy + sz & (1-c)xz - sy \ (1-c)xy - sz & c+(1-c)y^2 & (1-c)yz + sx \ (1-c)xz + sy & (1-c)yz - sx & c+(1-c)z^2 end{bmatrix} ]

    其中,(c=cos heta, s = sin heta, x,y,z)分别为向量(vec n)的三个分量。

  • 相关阅读:
    数组优化 Dijkstra 最短路
    F
    树 (p155, 从中序和后续回复二叉树)
    矩阵连乘 LRJ白书 p141 栈 解析表达式
    Train Problem II HDU 1023 卡特兰数
    codevs 1166 矩阵取数游戏
    BZOJ 2754: [SCOI2012]喵星球上的点名
    2017.6.11 校内模拟赛
    HDU 2896 病毒侵袭
    UvaLive 4670 Dominating Patterns
  • 原文地址:https://www.cnblogs.com/back-to-the-past/p/11790055.html
Copyright © 2011-2022 走看看