WebGL第三十六课:三维向量的拉伸

245 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情

拉伸一个三维向量

问题的数学描述

我们有一个三维向量:(xyz)\left(\begin{array}{cc} x\\ y \\ z\end{array}\right), 我们现在想要:

  • xx 变成 axa x
  • yy 变成 bxb x
  • zz 变成 cxc x

问题就是:找到一个矩阵 T 使得: T * (xyz)\left(\begin{array}{cc} x\\ y \\ z\end{array}\right) = (axbycz)\left(\begin{array}{cc} ax\\ by \\ cz\end{array}\right)

得到拉伸矩阵 T

也就是说,不管xyz x ,y,z取什么值,这个等式都要成立才行。

我们知道,T 是一个 333 * 3 的矩阵,也就是有9个未知数。

这个解貌似很难得到。

但是矩阵理论里有一个额外的定理:

如果你确定 T 是一个线性变换 , 那么:

  • T 的第一列 就等于: T * (100)\left(\begin{array}{cc} 1\\ 0 \\ 0\end{array}\right) = (a00)\left(\begin{array}{cc} a\\ 0 \\ 0\end{array}\right)

  • T 的第二列 就等于: T * (010)\left(\begin{array}{cc} 0\\ 1 \\ 0\end{array}\right) = (0b0)\left(\begin{array}{cc} 0\\ b \\ 0\end{array}\right)

  • T 的第三列 就等于: T * (001)\left(\begin{array}{cc} 0\\ 0 \\ 1\end{array}\right) = (00c)\left(\begin{array}{cc} 0\\ 0 \\ c\end{array}\right)

至此,就完全得出来了:

T=[a000b000c]T = \begin{bmatrix} a & 0 & 0 \\ 0 & b & 0\\ 0 & 0 & c \end{bmatrix}

即:

[a000b000c](xyz)=(axbycz)\begin{bmatrix} a & 0 & 0 \\ 0 & b & 0\\ 0 & 0 & c \end{bmatrix} * \left(\begin{array}{cc} x\\ y \\ z\end{array}\right) = \left(\begin{array}{cc} ax\\ by \\ cz\end{array}\right)

不信试验一下,随便取一个 (xyz)=(234)\left(\begin{array}{cc} x\\ y \\ z\end{array}\right) = \left(\begin{array}{cc} 2\\ 3 \\ 4\end{array}\right)

经过矩阵乘法口算:T=[a000b000c]T = \begin{bmatrix} a & 0 & 0 \\ 0 & b & 0\\ 0 & 0 & c \end{bmatrix} * (234)\left(\begin{array}{cc} 2\\ 3 \\ 4\end{array}\right) = (2a3b4c)\left(\begin{array}{cc} 2a\\ 3b \\ 4c\end{array}\right)。验证完毕。

注意:拉伸变换是一个线性变换这件事,你得提前知道。

简介线性变换

先回顾一下,向量数乘的概念,就是把向量的所有元素全部乘以一个数值k。

比如说:

k(xyz) k* \left(\begin{array}{cc} x\\ y \\ z\end{array}\right) = (kxkykz)\left(\begin{array}{cc} kx\\ ky \\ kz\end{array}\right)

满足数乘性质

现在假设一个变换T,任意一个向量 x\mathrm {x}, 下面给出线性变换的第一个基本要求:

  • x\mathrm {x},先数乘kk,再经过TT的变换,得到结果1
  • x\mathrm {x},先经过TT的变换, 再数乘 kk, 得到结果2

如果 结果1 = 结果2, 则满足这个要求。

用拉伸来讲解一下:

就是说一个向量,一个拉伸矩阵T,有

  • 先拉伸T,再数乘k, 得到结果1
  • 先数乘k,再拉伸T, 得到结果2

此时,这两个结果,无论对于什么向量,都是满足的。

满足加法性质

我们知道两个向量加法很简单:

(x1y1z1)+(x2y2z2)=(x1+x2y1+y2z1+z2)\left(\begin{array}{cc} x_1\\ y_1 \\ z_1\end{array}\right) + \left(\begin{array}{cc} x_2\\ y_2 \\ z_2\end{array}\right) = \left(\begin{array}{cc} x_1 + x_2\\ y_1+y_2 \\ z_1+z_2\end{array}\right)

假设一个变换T,线性变换的加法性质,也是两个过程,结果对比一致:

  • 两个任意向量先加起来,在经过T,得到结果1
  • 两个向量先各自经过T,再加起来,得到结果2

此时要求 结果1 = 结果2

我们可以根据以上,两个简单的性质,来判断一个变换是否是线性变换。