2D Transformation
程度★ 難度★★★
2D Transformation
以下介紹二維平面的常見動作。
運用C++的複數函式庫,以複數表示二維座標,就能少寫很多程式碼。
Translate
「位移」是直直移動,大小不變。
運用Incremental Method的精神,圖形的位移,分解成線段的位移,分解成點的位移。
點的位移有兩種想法,第一種是座標相加的概念,位移量便是座標差;第二種是向量相加的概念,位移量便是向量差。
雖然第二種想法不太直覺,但是由於向量很強大,還是習慣一下向量吧!
Rotate
「旋轉」,先取一個旋轉中心點,旋轉整張圖。
點的旋轉,先把旋轉中心點位移至原點,就容易處理了。
複數相乘等於角度相加、長度相乘。製造一個複數,長度等於一,角度等於旋轉角度,就可以運用複數乘法,完成點的旋轉。
Scale
「縮放」,先取一個縮放中心點,縮放整張圖。
點的縮放,先把縮放中心點位移至原點,就容易處理了。
Project
「投影」,先取一條投影線,整張圖垂直投射至線上。
project這個英文單字有「投影」和「計畫」兩種意義,此處講的是「投影」。
點的投影有兩種想法,第一種想法是直線交點的概念,首先求出投影線與其法線,再解聯立方程式;第二種想法是向量內積的概念,首先把投影線位移至原點,就容易處理了。
雖然第二種想法不太直覺,但是由於向量很強大,老話一句,還是習慣一下向量吧!
Reflect
「鏡射」,先取一條對稱線,整張圖沿線翻轉,正面變反面。
reflect這個英文單字有「鏡射」和「反射」兩種意義,此處講的是「鏡射」。
用向量計算,就容易多了。
延伸閱讀:Homogeneous Coordinates
上述動作們,可以看成函數,輸入、輸出各是一個數對。
除了位移,其餘動作都是線性變換,可以表示成矩陣乘法。
為了讓位移也可以表示成矩陣乘法,於是發展了「齊次座標」的概念,增加一個維度,使得全部動作都可以表示成矩陣乘法。
有興趣的讀者請參考Computer Graphics相關書籍。
延伸閱讀:Affine
Point-Line Duality
程度★ 難度★★★
點線對偶
http://3glab.cs.nthu.edu.tw/~spoon/courses/CS631100/Lecture09_handout.pdf
http://people.ofset.org/~ckhung/b/ma/duality.php
二維平面上的點和線,可以等價地轉換成線和點。主要有兩種轉換方式,一般我們常用的是斜率與截距。
一、點 (a,b) 轉換成直線 y = ax - b 二、點 (a,b) 轉換成直線 ax + by = 1
附帶一提,Hough Transform是把二維座標轉換成極座標。
Planar Duality(Under Construction!)
程度★ 難度★★★
平面對偶