共用方式為


為何轉換順序很重要

單一 Matrix 物件可以儲存單一轉換或一連串的轉換。 後者稱為 複合轉換。 複合轉換的矩陣是乘以個別轉換的矩陣來取得。

在複合轉換中,個別轉換的順序很重要。 例如,如果您第一次旋轉,然後縮放,然後轉譯,就會得到與第一次平移、旋轉、縮放比例不同的結果。 在 Windows GDI+中,複合轉換是從左至右建置。 如果 S、R 和 T 分別是縮放、旋轉和轉譯矩陣,則產品 SRT (順序) 為第一個縮放的複合轉換矩陣,然後旋轉,然後轉譯。 產品 SRT 所產生的矩陣與產品 TRS 所產生的矩陣不同。

其中一個原因是旋轉和縮放等轉換是在座標系統的原點上完成。 縮放以原點為中心的物件會產生與調整已從原點移開的物件不同的結果。 同樣地,旋轉位於原點的物件會產生與旋轉已離開原點的物件不同的結果。

下列範例會結合縮放、旋轉和轉譯 (順序) 以形成複合轉換。 傳遞至Graphics::RotateTransform方法的Argument MatrixOrderAppend會指定旋轉會遵循縮放比例。 同樣地,傳遞至Graphics::TranslateTransform方法的MatrixOrderAppend引數會指定轉譯會遵循旋轉。

Rect rect(0, 0, 50, 50);
Pen pen(Color(255, 255, 0, 0), 0);
graphics.ScaleTransform(1.75f, 0.5f);
graphics.RotateTransform(28.0f, MatrixOrderAppend);
graphics.TranslateTransform(150.0f, 150.0f, MatrixOrderAppend);
graphics.DrawRectangle(&pen, rect);

下列範例會進行與上一個範例相同的方法呼叫,但會反轉呼叫的順序。 產生的作業順序會先轉譯,然後旋轉,然後縮放,這會產生與第一個縮放比例非常不同的結果,然後旋轉,然後轉譯:

Rect rect(0, 0, 50, 50);
Pen pen(Color(255, 255, 0, 0), 0);
graphics.TranslateTransform(150.0f, 150.0f);
graphics.RotateTransform(28.0f, MatrixOrderAppend);
graphics.ScaleTransform(1.75f, 0.5f, MatrixOrderAppend);
graphics.DrawRectangle(&pen, rect);

反轉複合轉換中個別轉換順序的其中一種方式,就是反轉方法呼叫序列的順序。 控制作業順序的第二種方式是變更矩陣順序引數。 下列範例與上一個範例相同,不同之處在于 MatrixOrderAppend 已變更為 MatrixOrderPrepend。 矩陣乘法會依 SRT 的順序完成,其中 S、R 和 T 是縮放、旋轉和轉譯的矩陣。 複合轉換的順序是第一次縮放,然後旋轉,然後轉譯。

Rect rect(0, 0, 50, 50);
Pen pen(Color(255, 255, 0, 0), 0);
graphics.TranslateTransform(150.0f, 150.0f,MatrixOrderPrepend);
graphics.RotateTransform(28.0f, MatrixOrderPrepend);
graphics.ScaleTransform(1.75f, 0.5f, MatrixOrderPrepend);
graphics.DrawRectangle(&pen, rect);

上述範例的結果與本節第一個範例中達到的結果相同。 這是因為我們反轉方法呼叫的順序和矩陣乘法的順序。