博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GdiPlus[46]: IGPMatrix 矩阵(一)
阅读量:6702 次
发布时间:2019-06-25

本文共 2200 字,大约阅读时间需要 7 分钟。

  hot3.png

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

转载于:https://my.oschina.net/hermer/blog/320567

你可能感兴趣的文章
如何删除一个标签,但是保留里面的内容?
查看>>
[Angular] 'providedIn' for service
查看>>
PHP函数register_shutdown_function的使用示例
查看>>
设计模式-行为型模式,python访问者模式
查看>>
GIT 常用命令
查看>>
开源网站流量统计系统Piwik源码分析——后台处理(二)
查看>>
new FormData() - FormData对象的作用及用法
查看>>
Out of memory: Kill process 内存不足
查看>>
linux 基础(一)
查看>>
ejb-jar.xml
查看>>
最新杭州地铁开通时间表
查看>>
关闭shift中英文切换 英文代码/中文注释随意切换着写。
查看>>
距离北京奥运还有359天,发布WPF版本的北京2008标志(下)
查看>>
命令模式
查看>>
如何自定义长连接策略
查看>>
平衡二叉树与自平衡二叉树(红黑树)的区别
查看>>
读取JPG图片的Exif属性(一) - Exif信息简介
查看>>
【译文】追求生产极简主义
查看>>
FTP服务器原理(转)
查看>>
精选30道Java笔试题解答
查看>>