程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> GdiPlus[46]: IGPMatrix 矩陣(一)

GdiPlus[46]: IGPMatrix 矩陣(一)

編輯:Delphi

認識矩陣, 譬如這是一個 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; 


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved