認識矩陣, 譬如這是一個 2*3 (2 行 3 列) 的矩陣:
┏ ┓
┃3 1 4┃
┃2 5 0┃
┗ ┛
矩陣相加的例子:
┏ ┓ ┏ ┓ ┏ ┓
┃1 0┃ ┃2 4┃ ┃3 4┃
┃0 2┃ + ┃1 5┃ = ┃1 7┃
┃1 3┃ ┃0 6┃ ┃1 9┃
┗ ┛ ┗ ┛ ┗ ┛
在 GDI+ 中應用的矩陣運算是 "相乘".
矩陣相乘有個前提: 就是第一個矩陣的 "列數" 要和第二個矩陣的 "行數" 一致.
譬如: 矩陣 A*B 要乘以 矩陣 M*N, 要求 B = M.
GDI+ 中用到的 IGPMatrix 是 3*3 的, TGPColorMatrix 是 5*5 的, 都符合這個條件.
矩陣 A*B 與 M*N 相乘後會得到一個 A*N 的新矩陣;
譬如一個 "2 行 3 列" 的矩陣與 "3 行 4 列" 的矩陣相乘, 會得到一個 "2 行 4 列" 的新矩陣.
從下面例子中可以看出相乘的方法:
┏ ┓ ┏ ┓ ┏ ┓ ┏ ┓
┃1 2 3┃ ┃7 8 ┃ ┃1*7+2*9+3*11 1*8+2*10+3*12┃ ┃58 64 ┃
┃ ┃ * ┃9 10┃ = ┃ ┃ = ┃ ┃
┃4 5 6┃ ┃11 12┃ ┃4*7+5*9+6*11 4*8+5*10+6*12┃ ┃130 154┃
┗ ┛ ┗ ┛ ┗ ┛ ┗ ┛
因為 GDI+ 是二維的, IGPMatrix 矩陣的第 3 列一直是 0, 0, 1, 但為了相乘運算也必須有這個位置.
它們看起來是下面的樣子:
┏ ┓ ┏ ┓
┃1 0 0┃ ┃1 0 0┃
┃0 1 0┃ or ┃0 1 0┃
┃2 3 1┃ ┃4 5 1┃
┗ ┛ ┗ ┛
假如讓上面兩個矩陣相乘, 下面分別用 "手動運算" 與 "GDI+的函數運算" 對照下結果.
手動運算:
┏ ┓ ┏ ┓ ┏ ┓ ┏ ┓
┃1 0 0┃ ┃1 0 0┃ ┃1*1+0*0+0*4 1*0+0*1+0*5 1*0+0*0+0*1┃ ┃1 0 0┃
┃0 1 0┃ * ┃0 1 0┃ = ┃0*1+1*0+0*4 0*0+1*1+0*5 0*0+1*0+0*1┃ = ┃0 1 0┃
┃2 3 1┃ ┃4 5 1┃ ┃2*1+3*0+1*4 2*0+3*1+1*5 2*0+3*0+1*1┃ ┃6 8 1┃
┗ ┛ ┗ ┛ ┗ ┛ ┗ ┛
一個 IGPMatrix 矩陣的默認值(或者說單位矩陣)是:
┏ ┓
┃1 0 0┃
┃0 1 0┃
┃0 0 1┃
┗ ┛
//對角線上是 1, 其他都是 0; 這個默認值可通過 IGPMatrix.Reset 方法獲取.
根據各個位置的功能, GDI+ 給各位置命名如下(第三列沒有意義也沒有命名):
┏ ┓
┃M11 M12 0┃
┃M21 M22 0┃
┃DX DY 1┃
┗ ┛
上面測試的例子, 只是 DX 與 DY 的值非默認, 因而下面的測試也可以簡單些:
uses GdiPlus;
procedure TForm1.FormCreate(Sender: TObject);
var
Matrix1, Matrix2: IGPMatrix;
begin
Matrix1 := TGPMatrix.Create;
Matrix2 := TGPMatrix.Create;
Matrix1.SetElements(1, 0, 0, 1, 2, 3); //參數順序是: M11 M12 M21 M22 DX DY
Matrix2.SetElements(1, 0, 0, 1, 4, 5);
Matrix1.Multiply(Matrix2);
ShowMessageFmt('DX:%g, DY:%g', [Matrix1.OffsetX, Matrix1.OffsetY]);
//結果是: DX:6, DY:8
end;