什么是线性变换?
假设有一数学函数 f f f,使得三维向量 v ⃗ = ( x , y , z ) \vec v=(x,y,z) v=(x,y,z),有 f ( v ⃗ ) = f ( x , y , z ) = ( x ′ , y ′ , z ′ ) f(\vec v) = f(x, y, z) = (x',y',z') f(v)=f(x,y,z)=(x′,y′,z′)。那么,如果 f f f满足:
- f ( u ⃗ + v ⃗ ) = f ( u ⃗ ) + f ( v ⃗ ) f(\vec u + \vec v) = f(\vec u) + f(\vec v) f(u+v)=f(u)+f(v)
- f ( k v ⃗ ) = k f ( v ⃗ ) f(k \vec v) = kf(\vec v) f(kv)=kf(v)
那么,称 f f f为线性变换。
线性变换的矩阵表示
f ( v ⃗ ) = f ( x i ⃗ + y j ⃗ + z k ⃗ ) = f ( x i ⃗ ) + f ( y j ⃗ ) + f ( z k ⃗ ) = x f ( i ⃗ ) + y f ( j ⃗ ) + z f ( k ⃗ ) = [ x , y , z ] ⋅ [ f ( i ⃗ ) f ( j ⃗ ) f ( k ⃗ ) ] \begin{aligned} 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 \begin{bmatrix} f(\vec i) \\ f(\vec j) \\ f(\vec k) \end{bmatrix} \end{aligned} f(v)=f(xi+yj+zk)=f(xi)+f(yj)+f(zk)=xf(i)+yf(j)+zf(k)=[x,y,z]⋅⎣⎡f(i)f(j)f(k)⎦⎤
缩放变换
易知,缩放变换
S
(
v
⃗
)
=
S
(
x
,
y
,
z
)
=
(
s
x
x
,
s
y
y
,
s
z
z
)
S(\vec v) = S(x, y, z) = (s_x x, s_y y, s_z z)
S(v)=S(x,y,z)=(sxx,syy,szz)。那么,我们尝试证明一下它是线性变换:
S
(
u
⃗
+
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
x
u
x
+
s
x
v
x
,
s
y
u
y
+
s
y
v
y
,
s
z
u
z
+
s
z
v
z
)
=
(
s
x
u
x
,
s
y
u
y
,
s
z
u
z
)
+
(
s
x
v
x
,
s
y
v
y
,
s
z
v
z
)
=
S
(
u
⃗
)
+
S
(
v
⃗
)
\begin{aligned} 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{aligned}
S(u+v)=S(ux+vx,uy+vy,uz+vz)=(sx(ux+vx),sy(uy+vy),sz(uz+vz))=(sxux+sxvx,syuy+syvy,szuz+szvz)=(sxux,syuy,szuz)+(sxvx,syvy,szvz)=S(u)+S(v)
S ( k v ⃗ ) = S ( k v x , k v y , k v z ) = ( k s x v x , k s y v y , k s z v z ) = k ( s x v x , s y v y , s z v z ) = k S ( v ⃗ ) \begin{aligned} S(k\vec 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{aligned} S(kv)=S(kvx,kvy,kvz)=(ksxvx,ksyvy,kszvz)=k(sxvx,syvy,szvz)=kS(v)
综上,我们证明了缩放变换是线性变换。由之前线性变换的矩阵表示,我们可以推导缩放变换的矩阵表示为
[
S
(
i
⃗
)
S
(
j
⃗
)
S
(
k
⃗
)
]
=
[
s
x
0
0
0
s
y
0
0
0
s
z
]
\begin{bmatrix} S(\vec i) \\ S(\vec j) \\ S(\vec k) \end{bmatrix} = \begin{bmatrix} s_x & 0 & 0 \\ 0 & s_y & 0 \\ 0 & 0 & s_z \end{bmatrix}
⎣⎡S(i)S(j)S(k)⎦⎤=⎣⎡sx000sy000sz⎦⎤
旋转变换
我们定义旋转变换为将一个向量 v ⃗ \vec v v绕任意轴 n ⃗ \vec n n顺时针旋转 θ \theta θ角度,如图所示:
由图可知,我们要求的就是将向量
v
⃗
\vec v
v绕向量
n
⃗
\vec n
n旋转
θ
\theta
θ角度后得到的
v
⃗
′
\vec v'
v′。首先,我们注意到在旋转过程中,与旋转轴平行的向量是不参与旋转过程的,只有与旋转轴垂直的向量在真正旋转。因此可以将向量
v
⃗
\vec v
v分解为与
n
⃗
\vec n
n平行的向量
v
⃗
∥
\vec v_\parallel
v∥和垂直的向量
v
⃗
⊥
\vec v_\perp
v⊥。即:
v
⃗
=
v
⃗
∥
+
v
⃗
⊥
\vec v = \vec v_\parallel + \vec v_\perp
v=v∥+v⊥
那么
v
⃗
′
=
v
⃗
∥
+
v
⃗
⊥
′
\vec v' = \vec v_\parallel + \vec v'_\perp
v′=v∥+v⊥′
其中,平行向量
v
⃗
∥
\vec v_\parallel
v∥是向量
v
⃗
\vec v
v在旋转轴
n
⃗
\vec n
n上的投影。这里假定,旋转轴向量
n
⃗
\vec n
n是归一化过的,即单位向量。由向量投影的定义,可得到
v
⃗
∥
=
(
v
⃗
⋅
n
⃗
)
n
⃗
\vec v_\parallel = (\vec v \cdot \vec n) \vec n
v∥=(v⋅n)n
进而可得
v
⃗
⊥
=
v
⃗
−
v
⃗
∥
=
v
⃗
−
(
v
⃗
⋅
n
⃗
)
n
⃗
\vec v_\perp = \vec v - \vec v_\parallel = \vec v - (\vec v \cdot \vec n) \vec n
v⊥=v−v∥=v−(v⋅n)n
接下来,我们只要求得旋转后的
v
⃗
⊥
′
\vec v'_\perp
v⊥′即可。注意到已知的
v
⃗
⊥
\vec v_\perp
v⊥,且这两个向量都位于同一个圆的旋转平面上,因此只要再得到一个垂直于
v
⃗
⊥
\vec v_\perp
v⊥的向量
w
⃗
\vec w
w,且向量
w
⃗
\vec w
w与这两个向量共面,就可以通过旋转角度
θ
\theta
θ算出向量
v
⃗
⊥
′
\vec v'_\perp
v⊥′了:
v
⃗
⊥
′
=
v
⃗
⊥
⋅
c
o
s
θ
+
w
⃗
⋅
s
i
n
θ
\vec v'_\perp = \vec v_\perp \cdot cos\theta + \vec w \cdot sin\theta
v⊥′=v⊥⋅cosθ+w⋅sinθ
那么,怎样的
w
⃗
\vec w
w是满足以上条件的呢?注意到向量的叉积的几何意义:两向量的叉积后得到的向量与这两个向量是垂直的。所以,我们令
w
⃗
=
∣
v
⃗
⊥
∣
∣
n
⃗
×
v
⃗
∣
⋅
(
n
⃗
×
v
⃗
)
\vec w = \frac{|\vec v_\perp|}{|\vec n \times \vec v|} \cdot (\vec n \times \vec v)
w=∣n×v∣∣v⊥∣⋅(n×v)
向量前面的系数是为了让向量的模与
v
⃗
⊥
\vec v_\perp
v⊥相等。这样就求出了满足条件的
w
⃗
\vec w
w。特别地,由向量叉积的定义,可以将上式简化为
w
⃗
=
∣
v
⃗
⊥
∣
∣
n
⃗
∣
∣
v
⃗
∣
s
i
n
θ
⋅
(
n
⃗
×
v
⃗
)
\vec w = \frac{|\vec v_\perp|}{|\vec n| |\vec v| sin\theta} \cdot \ (\vec n \times \vec v)
w=∣n∣∣v∣sinθ∣v⊥∣⋅ (n×v)
由图可知,
∣
v
⃗
⊥
∣
=
∣
v
⃗
∣
s
i
n
θ
|\vec v_\perp| = |\vec v| sin\theta
∣v⊥∣=∣v∣sinθ,而向量
n
⃗
\vec n
n是单位向量,所以得到:
w
⃗
=
n
⃗
×
v
⃗
\vec w = \vec n \times \vec v
w=n×v
综合以上若干等式,求出最终的
v
⃗
′
\vec v'
v′为
v
⃗
′
=
(
v
⃗
⋅
n
⃗
)
n
⃗
+
(
v
⃗
−
(
v
⃗
⋅
n
⃗
)
n
⃗
)
c
o
s
θ
+
(
n
⃗
×
v
⃗
)
s
i
n
θ
\vec v' = (\vec v \cdot \vec n) \vec n + (\vec v - (\vec v \cdot \vec n) \vec n)cos\theta + (\vec n \times \vec v)sin\theta
v′=(v⋅n)n+(v−(v⋅n)n)cosθ+(n×v)sinθ
回到线性变换的定义来,旋转变换
R
(
v
⃗
)
=
R
(
x
,
y
,
z
)
R(\vec v) = R(x, y, z)
R(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
)
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)
R(x,y,z)=(r11x+r21y+r31z,r12x+r22y+r32z,r13x+r23y+r33z)
根据线性变换的定义,容易证明旋转变换是一种线性变换。那么,旋转变换的矩阵表示为:
[
R
(
i
⃗
)
R
(
j
⃗
)
R
(
k
⃗
)
]
=
[
r
11
r
12
r
13
r
21
r
22
r
23
r
31
r
32
r
33
]
=
[
c
+
(
1
−
c
)
x
2
(
1
−
c
)
x
y
+
s
z
(
1
−
c
)
x
z
−
s
y
(
1
−
c
)
x
y
−
s
z
c
+
(
1
−
c
)
y
2
(
1
−
c
)
y
z
+
s
x
(
1
−
c
)
x
z
+
s
y
(
1
−
c
)
y
z
−
s
x
c
+
(
1
−
c
)
z
2
]
\begin{bmatrix} R(\vec i) \\ R(\vec j) \\ R(\vec k) \end{bmatrix} = \begin{bmatrix} r_{11} & r_{12} & r_{13} \\ r_{21} & r_{22} & r_{23} \\ r_{31} & r_{32} & r_{33} \end{bmatrix} = \begin{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}
⎣⎡R(i)R(j)R(k)⎦⎤=⎣⎡r11r21r31r12r22r32r13r23r33⎦⎤=⎣⎡c+(1−c)x2(1−c)xy−sz(1−c)xz+sy(1−c)xy+szc+(1−c)y2(1−c)yz−sx(1−c)xz−sy(1−c)yz+sxc+(1−c)z2⎦⎤
其中,
c
=
c
o
s
θ
,
s
=
s
i
n
θ
,
x
,
y
,
z
c=cos\theta, s = sin\theta, x,y,z
c=cosθ,s=sinθ,x,y,z分别为向量
n
⃗
\vec n
n的三个分量。