仿射變換

本文的閱讀等級:初級

A 為一個 n\times n 階實矩陣,\mathbf{b}n 維實向量,定義於幾何向量空間 \mathbb{R}^n 的仿射變換 (affine transformation) 具有下列形式:

T(\mathbf{x})=A\mathbf{x}+\mathbf{b}

直白地說,仿射變換由一個線性變換加上一個平移量構成。因為 T(\mathbf{0})=\mathbf{b},除非平移量 \mathbf{b} 為零,仿射變換不是線性變換。仿射變換有兩個相當特殊的性質:共線 (collinearity) 不變性和比例不變性,意思是 \mathbb{R}^n 的任一直線經仿射變換的像 (image) 仍是一直線,而且直線上各點之間的距離比例維持不變。

 
L\mathbb{R}^n 中任一直線,其參數式為 L=\{t\mathbf{v}+\mathbf{u}\vert t\in\mathbb{R}\},向量 \mathbf{v}\neq\mathbf{0} 代表直線指向,\mathbf{u} 是直線上一點。令 \mathbf{p}_1,\mathbf{p}_2,\mathbf{p}_3 為直線 L 上的三個相異點,也就有 \mathbf{p}_i=t_i\mathbf{v}+\mathbf{u}i=1,2,3,此三點經仿射變換 T(\mathbf{x})=A\mathbf{x}+\mathbf{b} 後的新位置分別為

\begin{aligned}  \mathbf{p}_i^{\prime}&=T(\mathbf{p}_i)\\  &=A(t_i\mathbf{v}+\mathbf{u})+\mathbf{b}\\  &=t_iA\mathbf{v}+A\mathbf{u}+\mathbf{b},~~i=1,2,3.\end{aligned}

\mathbf{v}^{\prime}=A\mathbf{v}\mathbf{u}^{\prime}=A\mathbf{u}+\mathbf{b},新位置可以表示成 \mathbf{p}^{\prime}_i=t_i\mathbf{v}^{\prime}+\mathbf{u}^{\prime},所以確認這三個點經過仿射變換後仍位於同一直線 L^{\prime}=\{t\mathbf{v}^{\prime}+\mathbf{u}^{\prime}\vert t\in\mathbb{R}\}。計算三點之間的距離比例,

\begin{aligned}  \displaystyle\frac{\Vert\mathbf{p}^{\prime}_{2}-\mathbf{p}^{\prime}_1\Vert}{\Vert\mathbf{p}^{\prime}_{3}-\mathbf{p}^{\prime}_2\Vert}&=\frac{\Vert(t_2-t_1)\mathbf{v}^{\prime}\Vert}{\Vert(t_3-t_2)\mathbf{v}^{\prime}\Vert}=\frac{\Vert(t_2-t_1)\mathbf{v}\Vert}{\Vert(t_3-t_2)\mathbf{v}\Vert}=\frac{\Vert\mathbf{p}_2-\mathbf{p}_1\Vert}{\Vert\mathbf{p}_3-\mathbf{p}_2\Vert}\end{aligned}

上式證明了仿射變換維持各點之間的距離比例。

 
為了讓所有常用的幾何變換──旋轉、鏡射、伸縮、切變與平移等皆可納入同一套矩陣乘法運算機制,我們引入齊次座標 (homogeneous coordinates) 的概念與技巧。下面的分塊矩陣乘法把仿射變換的 A 矩陣和 \mathbf{b} 向量併入一個增廣變換矩陣:

T(\mathbf{x})=\begin{bmatrix}    A&\mathbf{b}    \end{bmatrix}\begin{bmatrix}    \mathbf{x}\\    1    \end{bmatrix}

此式富有高度暗示性,若將 n 維向量 \mathbf{x} 擴充成 n+1 維增廣向量 \begin{bmatrix}    \mathbf{x}\\    1    \end{bmatrix},也稱為齊次座標,如此一來,仿射變換即可表示為增廣矩陣和齊次座標向量的乘積:

\begin{bmatrix}    T(\mathbf{x})\\    1    \end{bmatrix}=\begin{bmatrix}    A&\mathbf{b}\\    \mathbf{0}^T&1    \end{bmatrix}\begin{bmatrix}    \mathbf{x}\\    1    \end{bmatrix}

上面的 (n+1)\times(n+1) 階增廣矩陣 \begin{bmatrix}    A&\mathbf{b}\\    \mathbf{0}^T&1    \end{bmatrix} 稱為仿射變換矩陣。不難觀察出

\begin{aligned}  \begin{bmatrix}    A&\mathbf{b}\\    \mathbf{0}^T&1    \end{bmatrix}\begin{bmatrix}    A^{-1}&-A^{-1}\mathbf{b}\\    \mathbf{0}^T&1    \end{bmatrix}&=\begin{bmatrix}    I_n&\mathbf{0}\\    \mathbf{0}^T&1    \end{bmatrix}=I_{n+1}\end{aligned}

這指出若 A 是可逆的,則仿射變換 T(\mathbf{x}) 是可逆的,反之亦然,逆仿射變換即為

\begin{aligned}  T^{-1}(\mathbf{x})&=A^{-1}\mathbf{x}-A^{-1}\mathbf{b}=A^{-1}(\mathbf{x}-\mathbf{b})\end{aligned}

 
以下整理了數個以仿射變換矩陣表示的 \mathbb{R}^2 幾何變換,關於幾何變換矩陣的推導請參閱“幾何變換矩陣的設計”。

平移

Tr(a,b)=\begin{bmatrix}    1&0&a\\    0&1&b\\    0&0&1    \end{bmatrix}

旋轉

R(\theta)=\begin{bmatrix}    \cos\theta&-\sin\theta&0\\    \sin\theta&\cos\theta&0\\    0&0&1    \end{bmatrix}

鏡射

F(a,b)=\begin{bmatrix}    a^2-b^2&2ab&0\\    2ab&b^2-a^2&0\\    0&0&1    \end{bmatrix}

注意,鏡射線方向由 \begin{bmatrix}    a\\    b    \end{bmatrix} 指出,且 a^2+b^2=1

伸縮

S(s_x,s_y)=\begin{bmatrix}    s_x&0&0\\    0&s_y&0\\    0&0&1    \end{bmatrix}

切變

H_x(k)=\begin{bmatrix}    1&k&0\\    0&1&0\\    0&0&1    \end{bmatrix},~H_y(k)=\begin{bmatrix}    1&0&0\\    k&1&0\\    0&0&1    \end{bmatrix}

 
使用齊次座標的主要好處是我們可以藉由矩陣乘法運算合併多個仿射變換成一個複合變換,下面舉兩個仿射變換矩陣的設計例子。

 
例一:以平面上任意點為中心逆時針旋轉

\mathbf{p}=\begin{bmatrix}    a\\    b    \end{bmatrix} 為旋轉中心,對此點的旋轉可拆解成三個基本變換:

  1. 將旋轉中心 \mathbf{p} 平移至原點,平移矩陣為 T_r(-a,-b)
  2. 繞著原點逆時針旋轉 \theta,旋轉矩陣為 R(\theta)
  3. 再將原點平移至 \mathbf{p},平移矩陣為 Tr(a,b)

上面三個變換矩陣乘積即為所求,

Tr(a,b)R(\theta)Tr(-a,-b)=\begin{bmatrix}    \cos\theta&-\sin\theta&a(1-\cos\theta)+b\sin\theta\\    \sin\theta&\cos\theta&b(1-\cos\theta)-a\sin\theta\\    0&0&1    \end{bmatrix}

 
例二:對不穿越原點的直線鏡射

令鏡射線為 L=\{t\mathbf{v}+\mathbf{u}\vert t\in\mathbb{R}\}\mathbf{v}=\begin{bmatrix}    a\\    b    \end{bmatrix} 指出直線行進方向,a^2+b^2=1,非零向量 \mathbf{u}=\begin{bmatrix}    c\\    d\\    \end{bmatrix} 為直線上一點。類似例一的作法,對直線 L 鏡射可分解為三個基本變換,如下:

  1. 平移直線 L 使其穿越原點,平移矩陣為 Tr(-c,-d)
  2. 對此穿越原點的直線鏡射,變換矩陣為 F(a,b)
  3. 再把直線平移回原位置,平移矩陣即 Tr(c,d)

將上述三個矩陣相乘便得到

Tr(c,d)F(a,b)Tr(-c,-d)=\begin{bmatrix}    a^2-b^2&2ab&-c(a^2-b^2-1)-2dab\\    2ab&b^2-a^2&d(a^2-b^2+1)-2cab\\    0&0&1    \end{bmatrix}

Advertisement
This entry was posted in 線性代數專欄, 仿射幾何 and tagged , , . Bookmark the permalink.

1 Response to 仿射變換

  1. Pingback: [機器人學]為什麼要用齊次座標(homogenous coordinates)? – 諭吉的隨筆

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s