zoukankan      html  css  js  c++  java
  • GdiPlus[46]: IGPMatrix 矩阵(一)


    认识矩阵, 譬如这是一个 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;
    
  • 相关阅读:
    小程序 循环遍历 传参数 获取参数的方法
    小程序技巧 盒子布局
    小程序的初体验
    python制作网易云免费下载器
    数据结构实验报告之三元组顺序存储的稀疏矩阵练习(代码版)
    JavaFX作业8
    用JavaFX显示一个转动的风扇
    用JavaFX模拟一个交通信号灯
    数据结构作业周三必交
    大数据的就业观与考研观
  • 原文地址:https://www.cnblogs.com/del/p/1631605.html
Copyright © 2011-2022 走看看