认识矩阵, 譬如这是一个 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;