---
title: "複數與旋轉 (Complex Number & Rotation)"
path: "複數與旋轉 Complex Number & Rotation"
---
{%hackmd @RintarouTW/About %}
# 複數與旋轉 (Complex Number & Rotation)
<iframe src="https://rintaroutw.github.io/fsg/test/geo-basic-rotation.svg" width="768" height="600"></iframe>
## 旋轉從最熟悉的直角開始 (Rotation)
從觀察 $\pmatrix{a\\b}$ 對著原點轉 $90^\circ$ 開始,將 $「旋轉 90^\circ 的動作當成一個函數 f 」$看待,
$$
\begin{cases}\small
f\pmatrix{1\\0} =\pmatrix{0\\1}, & f\pmatrix{1\\0} \xrightarrow{輸出} \pmatrix{0\\1}\\[2ex]
f\pmatrix{0\\1} =\pmatrix{-1\\0}, & f\pmatrix{0\\1} \xrightarrow{輸出}\pmatrix{-1\\0}
\end{cases}
$$
$$
\begin{aligned}
f\pmatrix{a\\b} &= af\pmatrix{1\\0} + bf\pmatrix{0\\1} \\[2ex]
&= a\pmatrix{0\\1} + b\pmatrix{-1\\0} \\[2ex]
&= \pmatrix{-b\\a}
\end{aligned}
$$
白話的意思就是,向量(或座標)對著原點轉 $90^\circ$ 新的 $x$ 為原本的 $-y$,新的 $y$ 則是原本的 $x$,即「旋轉 $90^\circ$」$f(x,y) = (-y,x)$ 此對應關係。
若寫成程式就是
```
rotate90 = (x,y) => [-y, x];
```
一行搞定。若想寫成矩陣也很簡單,
$$
\begin{bmatrix}
x'\\
y'\\
\end{bmatrix}=
\begin{bmatrix}
0 & -1 \\
1 & 0
\end{bmatrix}
\begin{bmatrix}
x\\
y\\
\end{bmatrix}
$$
## 簡單的直角搞定了,那其它角呢?
同理,將「旋轉 $\theta$ 的動作當成一個函數 $f_\theta$」看待,
$$
\begin{cases}\small
f_\theta\pmatrix{1\\0} =\pmatrix{\cos{\theta}\\\sin{\theta}}, & f \pmatrix{1\\0} \xrightarrow{輸出} \pmatrix{\cos{\theta}\\ \sin{\theta}}\\[2ex]
f_\theta\pmatrix{0\\1} = \pmatrix{-\sin{\theta}\\ \cos{\theta}}, & f\pmatrix{0\\1} \xrightarrow{輸出}\pmatrix{-\sin{\theta}\\ \cos{\theta}}
\end{cases}
$$
$$
\begin{aligned}
f_\theta\pmatrix{a\\b}
&= af_\theta\pmatrix{1\\0} + bf_\theta\pmatrix{0\\1} \\[2ex]
&= a\pmatrix{\cos{\theta}\\ \sin{\theta}} + b\pmatrix{-\sin{\theta}\\ \cos{\theta}} \\[2ex]
&= \pmatrix{a\cos{\theta} - b\sin{\theta}\\a\sin{\theta} + b\cos{\theta}}
\end{aligned}
$$
寫成矩陣形式也是相同道理:
$$
\begin{bmatrix}
x'\\
y'\\
\end{bmatrix}=
\begin{bmatrix}
\cos{\theta} & -\sin{\theta}\\
\sin{\theta} & \cos{\theta}
\end{bmatrix}
\begin{bmatrix}
x\\
y\\
\end{bmatrix}
$$
## 複數 ${i}$ 是什麼?
如果我們無法顧名思義,那就從其行為來分析了解吧!
令一複數向量為 $c + di\ 且\ c, d \in \mathbb{R},與\ x\ 軸夾角為\ \theta$
$$
c + di \iff \pmatrix{c \\ di}
$$
再令一實數為 $a$ 乘上 $c+di$
$$
a\ (c+di) = a\pmatrix{c \\ di} = ac + adi
$$
實數乘上實數還是實數,乘上虛數仍為虛數,單純比例變化。
再試試複數 $b{i}$ 乘複數,看看結果如何。
$$
bi\ (c+di) = b\times i\pmatrix{c \\ di} = b\ (-d + ci) = b\pmatrix{-d \\ ci}
$$
複數相乘有實變虛,虛變實之能。
$$
i\pmatrix{c\\di} = \pmatrix{-d\\ci}
$$
又從此可看出,經過複數 $i$ 的乘法後再取實部,則等價於
$$
f\pmatrix{c\\d} = \pmatrix{-d\\c}
$$
利用以上原則,再來完整試試兩複數相乘,
$$
\begin{aligned}
(a+bi)(c+di)&= a(c + di) + bi(c + di) \\[2ex]
&= a\pmatrix{c\\di} + bi\pmatrix{c\\di} \\[2ex]
&= a\pmatrix{c\\di} + b\pmatrix{-d\\ci} \\[2ex]
\text{if } (c+di) = (cos\theta+sin\theta i) \implies \\[2ex]
&=a\pmatrix{\cos{\theta}\\ \sin{\theta}{i}} + b\pmatrix{-\sin{\theta}\\ \cos{\theta} i}\\\\[2ex]
去\ i\ 取實部後與\ f_\theta\pmatrix{a\\b} &= \pmatrix{a\cos{\theta} - b\sin{\theta}\\a\sin{\theta} + b\cos{\theta}}等價\\\\[2ex] \implies
\pmatrix{a\\bi}\pmatrix{c\\di} &= \pmatrix{ac-bd\\(ad+bc)i}\end{aligned}
$$
若將 $a,b,c,d$ 替換成 $x, y$ 的表現形式
$$
\pmatrix{x_1\\y_1i}\pmatrix{x_2\\y_2i} = \pmatrix{x_1x_2-y_1y_2\\(x_1y_2+y_1x_2)i}
$$
這樣的結果,只需去掉 $i$ 就和 $f_\theta$ 等價了,也就是說 $i$ 的乘法就等同於旋轉動作本身。這個結果則代表了兩複數向量可以完全不透過角度,只憑在 $x, y$ 的分量做固定的線性組合得到完成旋轉的結果。
PS. 只是結果會是兩向量長度相乘,但重要的是轉動後方向是對的,長度是小事。
此兩複數向量相乘結果的結果,組成了一個實際以**原本兩向量夾角相加且長度相乘**的新向量。
## 複數在應用上有何特別?
在數學上計算角度時的表達式,如 $a\ \sin{\theta} - b\ \cos{\theta}$ 是沒有誤差的;但實際以電腦來做計算時,即使是相同的 $\theta$ 代入 $\arcsin{(\sin{\theta)})}$ 與 $\arccos{(\cos{\theta)})}$ 都會因為浮點數精度而有誤差,也就是說數學上
$$
\arccos{(\cos{\theta})} = \theta
$$
實際寫程式用電腦計算,因為誤差存在,
$$
\arccos{(\cos{\theta})} \ne \theta
$$
導致直接使用角度來做計算座標時,稍不注意誤差累積就會造成無法預料的錯誤。
而複數只使用 $x,\ y$ 座標值,不轉換成角度的運算就能確保誤差不會累積。
使用複數計算時,可直接得到最終旋轉後的向量,也可免除判斷是否需要改為補角的麻煩。
## 為什麼應該學習複數?
* 四元數實現三度空間旋轉 (避免 Gimbal Lock)
* 更高維空間推導規則的方法
###### tags: `math` `i` `complex number` `rotation`