GDI+ 的Matrix::TransformPoints 與 仿射變換 c++

來源:互聯網
上載者:User

到百度搜尋“仿射變換”,有很多介紹的。

 

這是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同理)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.