GDI+、HTML5、cairo等繪圖庫中matrix理解的總結

    GDI+、HTML5、cairo都是二維繪圖庫,他們的api都提供縮放、旋轉、平移等矩陣變換操作,還可以修改matrix,指定變換矩陣。但是,當做一個繪圖引擎底層使用這些繪圖庫時,就發現他們的概念不明確,網上資料、包括很多書,都講得是一些似是而非的概念,經過總結,得出我自己的正確版本,如下所述:

    首先,座標系的概念。GDI+中以winform程序爲準描述如下,有3個座標系:世界座標系、頁面座標系、設備座標系(參見GDI+ SDK官方手冊)。HTML5和cairo中,分爲世界座標系和用戶座標系。

    其次,變換的概念。變換,是指對座標系中的圖形進行變換,通過將圖形的每個點座標乘以變換矩陣來實現。

    第三,變換的過程。這塊是重點,GDI+與HTML5和cairo不同。GDI+同時支持變換座標系和變換物體。HTML5和cairo僅支持變換座標系。

    變換座標系,就是在當前座標系中,進行縮放、旋轉、平移或直接乘變換矩陣等操作,得到新座標系,之後,在新的座標系中又可以進行變換,如此循環往復。最後用戶調用api進行繪圖時傳入的座標是最新的座標系中的座標,這樣,就可以保持座標不變,僅通過變換座標系實現繪製。

    變換物體,就是僅存在一個座標系,即世界座標系,物體的座標就是在世界座標系中的座標,變換物體即物體的座標乘變換矩陣,得到世界座標系中的新座標。

    GDI+對變換座標系和變換物體的支持:

    各API中加參數MatrixOrder.Prepend即表示在當前變換矩陣前插入矩陣(左乘),對應變換座標系,加參數MatrixOrder.Append即表示在當前變換矩陣後插入矩陣(右乘),對應變換物體。GDI+中座標以行向量表示,座標變換形如:

           |m11, m12, 0|

|x,y,1|  |m21, m22, 0| = |x', y', 1|,

           |m31, m32, 1|

用P表示點,M表示變換矩陣則有

P M1 M2 ... Mn = P',

其表示變換物體,即在世界座標系中,對物體進行若干次變換,得到新的物體座標。

當變換座標系時,

用Q表示座標,N表示變換矩陣擇優

Q Nn Nn-1 ... N1 = Q',

其表示從最新的座標系中座標Q倒推出世界座標系中的座標Q'的過程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章