不少程式設計入門的教學中,常使用電腦繪圖、自走車、機器人等作為學習的回饋機制,其中,簡單幾何數學佔了重要的角色,而座標旋轉為常見處理。

有機會的話,試著導證一下旋轉公式或矩陣,因為,這就像是研讀原始碼一樣的有趣,也具有實用的價值。

繞XYZ軸旋轉

如果有個座標(x,y),繞原點逆時針旋轉θ度後的新座標為(x',y'),旋轉公式會是x'=x*cos(θ)-y*sin(θ),y'=x*sin(θ)+y*cos(θ),這只要用基本的三角函式及聯立方程式,就可以導證出來。若以矩陣來表示轉換,會比較簡明,使用一維線性陣列來撰寫的話,列為主的寫法會是[cos(θ), -sin(θ), sin(θ), cos(θ)]。

上述的表示法是基於笛卡兒平面,兩個軸都代表著實數,實際上,旋轉問題也可以用複數來處理,將a+bj看成是複數平面上的點,平面橫軸為實數軸,直軸為虛數軸,複數z1若為cosθ+isinθ,θ為z1與實數軸的夾角,將z1與任意複數z2相乘,由於複數運算上的一些特性,所得到的複數,相當於將z2繞著複數平面原點逆時針轉動θ度(https://bit.ly/2V8hZcX)。

關於二維平面旋轉,我們可以看成,是三維空間中繞著z軸旋轉xy平面上的座標。

基於二維空間旋轉公式的導證方式,可以很快地得出繞x、y軸旋轉的公式,也可以分別將三個轉換公式,以轉換矩陣的方式來表示(https://bit.ly/2XW9yOK),而轉換矩陣基本上有三個參數,也就是分別繞三個軸旋轉的角度(α,β,γ),稱為三個歐拉角(Euler angles)。

既然可以將笛卡兒平面的旋轉擴充到三維,那麼,我們有辦法將複數平面的作法,也跟著擴充到三維嗎?

例如,愛爾蘭數學家Hamilton曾將複數擴充為四元數(Quaternion),並運用四元數運算的特性,導出了繞任意指定軸旋轉的四元數旋轉矩陣,當然,也就因此可以處理繞XYZ軸旋轉。

就結論而言,若想繞著指定的軸來旋轉頂點,軸的部份使用單位向量(x,y,z)來表示,旋轉角度為θ的話,四元數q=w+ai+bj+ck的關係若為s=sin(θ/2)、w=cos(θ/2)、a=s*x、b=s*y、c=s*z,就可以用這四個數來得到旋轉矩陣(https://bit.ly/2IQVt1E),網路上可以找到許多關於四元數的導證說明。

然而,大家最常問的部分仍是:四元數到底是什麼?可否形象化的方式來表示四元數?

想知道答案的話,我們可以親自導證一次四元數旋轉矩陣。

Rodrigues旋轉公式

關於三維旋轉的問題,其實,也可以使用軸、角兩個量來表示。

舉例來說,軸可以使用單位向量(x,y,z)來表示,角用θ表示,歐拉角表示可以使用軸角來表示;軸會是笛卡兒座標的X、Y或Z軸,例如,繞X軸轉動時,X軸向量可表示為(1,0,0),至於四元數旋轉矩陣,基本上,也是透過給定軸、角兩個量來得到。

然而要做軸角旋轉,不一定找出對應的四元數來計算旋轉矩陣,透過Rodrigues旋轉公式也可以。若u為指定軸之單位向量,v為打算轉動的座標形成之向量,那麼,Rodrigues旋轉公式會是cos(θ)v+(1-cos(θ))(u‧v)u+sin(θ)(uxv)。

若對四元數或其旋轉矩陣的導證有興趣,認識Rodrigues旋轉公式的導證,會有所幫助,相對來說,導證過程也比較簡單(不用去結合四元數的運算特性)。

例如,Rodrigues旋轉導證的第一步,是將v分解為兩個向量,一個向量是v投影在旋轉構成的平面上,另一個向量是投影在u上,兩個向量基於u旋轉後得到的向量相加,就是想要的結果。

對於投影在u上的向量,因為跟u平行,旋轉後還是相同,既然如此,就只要處理v投影在旋轉平面上的向量,v就是旋轉平面的橫軸,u與旋轉平面正交,那麼,旋轉平面的直軸,就可以用外積uxv得到,而一旦有了平面的橫軸與直軸,問題就被簡化為二維平面旋轉。

在整個公式化簡的過程中,會運用到u是單位向量,大小為1的特性,因此,只要細心計算,就可以得到公式(https://bit.ly/2LdKIZz)。

不過,上述的這個公式看起來複雜,有個轉換矩陣(https://bit.ly/2WfTpmT)與要轉動的向量結合後,等價於此公式,然而,相對於四元數旋轉矩陣來說,仍是複雜許多,因而比較少見到這個公式的運用或實作。

四元數與旋轉

雖然Rodrigues旋轉公式比較少用,然而導證過程與四元數旋轉矩陣的導證之間,有著密切關係,只不過四元數既然是四元數,表示得先掌握其運算基本特性。

最著名的例子,就是Hamilton刻在石頭上的式子i^2=j^2=k^2=ijk=-1,如果以四元數的運算特性簡單來說,就是在擴充複數的同時,也不能違反複數的運算性質。而這就跟複數不能違反實數的運算性質,負數、零在定義時不能違反自然數,都是一樣的道理。

有些幾何運算會產生複雜的過程或結果,像是一大堆三角函式轉換之類,這時,可以試著轉換為複數來運算。

由於複數本身包含了角度與長度資訊,而複數運算的特性,可以避開複雜運算過程。要了解這種換個系統運算的過程,若作個簡單類比,就像三維中的點,可以用直角座標來描述外,也可以用極座標來描述;有的問題用直角座標,就能簡單解決;有的問題,用極座標會比較適合。

而在四元數旋轉矩陣的導證過程,就像是結合了Rodrigues旋轉公式導證,以及四元數運算特性來得到結果的過程(https://bit.ly/2VB4cuW),一旦能夠看懂導證過程,也就解決了形象化四元數的問題,因為四元數描述了四維空間中的一個點,不過,四維空間的圖雖難以描繪,但是,投影在三維空間中的圖還是可以繪製,然而,點投影的結果也只是個點。

不過,若四元數q=w+ai+bj+ck的w、a、b、c有先前談到的關係時,θ變動時,每個點在四維空間中的軌跡,投影在三維世界的中的話,會是個複數平面上旋轉角度θ的圓弧,而圓弧θ/2處會是實數軸通過的位置。就軸角旋轉來說,真正關心的,並不是四元數在四維空間中的軌跡,而是三維空間中的投影,因此,若能知道三維世界中的投影是什麼,也就足夠了。

導證公式與閱讀原始碼

設法看懂公式的導證過程,某些程度就像是閱讀原始碼,因為,公式就像是函式簽署,導證的過程就是實作的內容,而閱讀原始碼的收獲,不僅認識了函式運作的原理、解題相關的知識與技巧,同時也學會從其他角度解題的思考方式,導證公式的過程也是如此。

無論是面對數學或程式碼,解題時具有不同思考方式是重要的,實際上在導證這些旋轉的過程中,意外地拼湊出一個解決方案,這也解掉了我一年來懸而未解的ISSUE(https://bit.ly/2IPGe98)。當我看到程式運算結果終於正確呈現的瞬間,得到一整個滿滿的欣喜與成就感!

作者簡介


Advertisement

更多 iThome相關內容