到百度搜尋“仿射變換”,有很多介紹的。
這是vs2008中的樣本:
VOID Example_TransPoints(HDC hdc)<br />{<br /> Graphics graphics(hdc);<br /> Pen pen(Color(255, 0, 0, 255));</p><p> Point points[5] = {<br /> Point(50, 100),<br /> Point(100, 50),<br /> Point(150, 125),<br /> Point(200, 100),<br /> Point(250, 150)};</p><p> Matrix matrix(1.0f, 0.0f, 0.0f, 2.0f, 0.0f, 0.0f);</p><p> graphics.DrawCurve(&pen, points, 5);<br /> matrix.TransformPoints(points, 5);<br /> graphics.DrawCurve(&pen, points, 5);<br />}<br />
代碼中,TransformPoints改變了points的值,實際上就是仿射變換。(這裡是平面中的變換)
先記下運行結果,points變為:
50, 200
100, 100
150, 250
200, 200
250, 300
可以看出:結果是在y軸放大一倍。
對於矩陣matrix,他實際上是3*3的矩陣:
| 1.0f 0.0f 0.0f| | 0.0f 2.0f 0.0f| | 0.0f 0.0f 1.0f|
matrix的第一個參數和第二個參數,分別是矩陣的第一行的第一個元素和第一行的第二個元素;
第三個參數和第四個參數,分別是矩陣的第二行的第一個元素和第二行的第二個元素;
第五個參數和第六個參數,分別是矩陣的第三行的第一個元素和第三行的第二個元素;
msdn中對matrix的建構函式有說明。
由於矩陣的第三列總是[0 0 1]T 所以就省略。
為什麼第三列省略了呢?請看百度詞條
http://baike.baidu.com/view/954621.htm
以平移變換為例(注意:要轉置一下):
| 1 0 0| | 0 1 0| | tx ty 1|
仿射變換的幾個基本操作的第三列都是[0 0 1]T,所以省略了
仿射變換(affine變換)的一般形式(不過似乎這個公式只包含了:平移變換,旋轉變換和縮放變換,不包含剪下變換):
| (λx)cosθ (λx)sinθ 0|| x1 y1 1| = | x y 1 | * | -(λy)sinθ (λy)cosθ 0| | x0 y0 1|
那麼變換後的座標就是:
x1 = (λx)x・cosθ - (λy)x・sinθ + x0y1 = (λx)x・sinθ + (λy)y・cosθ + y0
其中:
(x0,y0) 是原座標原點;
θ是座標旋轉角度;
λx和λy表示對於原座標系在x,y兩個座標軸上的放縮率;(注意λx是個整體,而不是λ乘以x;λy同理)