一. 仿射變換的定義和種類
仿射變換,affine transform。主要由線性變換和平移變換兩部分組成。
平移變換比較好理解,那麼什麼是線性變換呢?下面給出線性變換的幾個特徵:
- 變換之前是直線的,變換之後依然是直線。
- 變換前後比例不會變。也就是說,一開始某個點是線段的中點,在變換之後,依然還是重點。
旋轉變換就是一個非常重要的線性變換,大家請思考:一條線段經過旋轉之後,是不是仍然是一條線段?一條線段上的中點,在旋轉之後是不是還是中點?
類似旋轉變換這類的線性變換還有很多,總的來說,仿射變換可以分爲下面幾類:
平移,翻轉,旋轉,縮放,剪切。
二. 平移
平移的實現比較簡單,只要在原來向量的基礎上再加上一個平移向量就可以了:
還有另外一種更爲推薦的實現也可以進行平移變換,那就是捨棄向量的加法,改用矩陣乘法。
這樣做的好處是,能夠把所有affine transformation都統一成的形式。
對於2D的座標(x, y)而言,我們首先要把他擴展到齊次座標系下,再進行矩陣的乘法運算(其它座標也是如此)。
這個變換矩陣可以利用分塊矩陣的思想來看待,他引入了額外的維度和平移向量。
三. 翻轉
flip說直白一點就是對稱操作,比如之前展示的那個R型圖中,實際上就是所有點做了一個關於y軸的對稱。
關於翻轉這一點,有一個非常簡單的原則,那就是按照哪個軸翻轉,哪個座標就不變。
還是以2D座標爲例,像之前繞y軸翻轉,那麼縱座標就不變。(3D的也是同一個道理,比如按照xoy平面翻轉,那x y值都不用變)
這個變換矩陣也是比較簡單,就是在單位矩陣的基礎上,對某些角元做一個相反數就行了。
四. 旋轉
關於旋轉矩陣的介紹實在是太多了,這裏不介紹了,直接給出結果:
(1). 如果是2D座標系的話,其逆時針轉動的旋轉矩陣如下所示:
(2). 如果是3D座標系的話,其旋轉矩陣如下所示:
- 繞x軸旋轉,方向是yz平面順時針(與右手螺旋方向相反)
- 繞y軸旋轉,方向是zx平面順時針(與右手螺旋方向相反)
- 繞z軸尋轉,方向是xy平面順時針(與右手螺旋方向相反)
記憶方法:其實3D的旋轉矩陣就是2D的一個擴展。3D不同的矩陣其實就是行和列的一個互換。
五. 縮放
縮放更加簡單了,就是在單位矩陣對角元上把1改成其它正數。
比如我想要吧x的座標軸放大兩倍,我就可以用以下矩陣:
其它的就不說了,比較簡單。
六. 剪切
剪切的主要目的就是將一個標準的長方體轉換成平行四面體。
在形式上也比較簡單,以2D的爲例,如果是要x座標做橫向剪切: