--- 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`