什么是仿射变换?
仿射变换定义为一个线性变换加上平移变换。即:
[g(vec v) = f(vec v) + vec b
]
仿射变换的矩阵表示
[g(vec v)
= [x, y, z] cdot egin{bmatrix} f(vec i) \ f(vec j) \ f(vec k) end{bmatrix} + vec b
]
这里,我们要对向量(vec v = (x, y, z))转换为齐次坐标((x,y,z,w)),同样变换后的(g(vec v) = (x', y', z', w))也是齐次坐标。从而有:
[egin{align*}
g(vec v) &= [x, y, z, w] cdot egin{bmatrix} f(vec i) & 0 \ f(vec j) & 0 \ f(vec k) & 0 \ 0 & 0 end{bmatrix} + [x, y, z, w] cdot egin{bmatrix} 0 & 0 \ 0 & 0 \ 0 & 0 \ vec b & 1 end{bmatrix} \
&= [x, y, z, w] cdot egin{bmatrix} f(vec i) & 0 \ f(vec j) & 0 \ f(vec k) & 0 \ vec b & 1 end{bmatrix}
end{align*}
]
对于向量而言,(w)分量为0,因为平移对向量不起作用,对于点而言,(w)分量为1。
坐标系变换
在实际运用中经常遇到一个向量或者一个点在不同坐标系下的坐标表示。先来看看向量的情形:
对于向量(vec v),它在坐标系(A)下的坐标为((x, y, z)),求在坐标系(B)下的坐标((x', y', z'))。
实际上,无论坐标系如何变化,向量自身是不变的,那么我们有:
[vec v = x'vec i_B + y'vec j_B + z'vec k_B = xvec i_A + yvec j_A + zvec k_A
]
写成矩阵形式:
[[x',y',z'] = [x,y,z] cdot egin{bmatrix} vec i_A \ vec j_A \ vec k_A end{bmatrix}
]
其中,(vec i_A,vec j_A,vec k_A)是坐标系(A)的基向量在坐标系(B)的表示。类似地,反过来也可以得到:
[[x,y,z] = [x',y',z'] cdot egin{bmatrix} vec i_B \ vec j_B \ vec k_B end{bmatrix}
]
其中,(vec i_B,vec j_B,vec k_B)是坐标系(B)的基向量在坐标系(A)的表示。这里,可以发现一个有趣的现象:坐标系(A)的基向量在坐标系(B)的矩阵表示乘以坐标系(B)的基向量在坐标系(A)的矩阵表示得到的是单位矩阵。即:
[egin{bmatrix} vec i_A \ vec j_A \ vec k_A end{bmatrix} cdot egin{bmatrix} vec i_B \ vec j_B \ vec k_B end{bmatrix} = I
]
我们可以用三角函数的方法去证明它。
然后我们来看看点的情形。对于点(vec p),它在坐标系(A)下的坐标为((x, y, z)),求在坐标系(B)下的坐标((x', y', z'))。容易知道结果是类似的:
[vec p = x'vec i_B + y'vec j_B + z'vec k_B + vec o_B = xvec i_A + yvec j_A + zvec k_A + vec o_A
]
其中(o)为坐标系的原点坐标。写成矩阵形式:
[[x',y',z', 1] = [x,y,z, 1] cdot egin{bmatrix} vec i_A & 0 \ vec j_A & 0 \ vec k_A & 0 \ vec o_A & 1 end{bmatrix}
]
其中,(vec i_A,vec j_A,vec k_A, vec o_A)是坐标系(A)的基向量和原点在坐标系(B)的表示。