文档章节

GdiPlus[46]: IGPMatrix 矩阵(一)

涂孟超
 涂孟超
发布于 2014/09/26 15:38
字数 612
阅读 9
收藏 0

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

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2009/12/24/1631605.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
GDI+里面的问题。。。。。。。。。。

error C2248: “Gdiplus::Bitmap::Bitmap”: 无法访问 private 成员(在“Gdiplus::Bitmap”类中声明) 1> c:\program files\microsoft sdks\windows\v7.0a\include\gdiplusheaders.h(630) : ......

xxdd
2013/10/24
65
0
vs 2005 添加GDI配置

在VS2005当中由于自带了GDI+的开发包,所以不需要在安装GDI开发包,这些头文件的位置由VS中的$(WindowsSdkDir)/include自动包含进来了 下午自己添加了好几次,总是出现有报错,,在 stdafx.h...

种地瓜
2015/12/08
85
0
MFC边框重绘

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 pragma once incl......

江河海流
2016/01/30
509
0
在DLL中调用createwindows,报错1407

//初始化 AtlAxWinInit(); Gdiplus::GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); //名字和当......

哈大哈傻瓜
2016/03/27
136
0
模仿酷狗7(Kugou7)音乐魔方界面源码

源码名称:模仿酷狗7(Kugou7)界面源码 源码作者:邓学彬(泪闯天涯) 源码说明:内含VC++源码、易语言源码各一份.包含所有图片源码(使用Fireworks编辑) 开发环境:VC版--VS2005、Gdiplus;易语...

邓学彬
2012/12/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

用Redis实现“秒杀”系统

导论 曾经被问过好多次怎样实现秒杀系统的问题。昨天又在CSDN架构师微信群被问到了。因此这里把我设想的实现秒杀系统的价格设计分享出来。供大家参考。 秒杀系统的架构设计 秒杀系统,是典型...

小刀爱编程
3分钟前
0
0
GO redis 相关操作

在gopath 目录下安装 go get github.com/garyburd/redigo/redis package mainimport ("fmt""github.com/garyburd/redigo/redis")//定义一个全局链接池变量var pool *redis.Pool//......

汤汤圆圆
41分钟前
9
0
java8性特性,常用的lambda表达式

1、抽取多个对象中的某个属性,用数组接收 List<Student> students = new ArrayList<>(); List<String> names =students.stream().map(Student::getName).collect(Collectors.toList()); 2、......

Boss-x
42分钟前
11
0
flutter 子组件与父组件

无论是子组件还是父组件,任何时候initState()只执行一次,如果需要判断 就在build里面进行,不然无效的。

大灰狼wow
44分钟前
4
0
Rancher Labs引入全球首个多集群、多租户的Prometheus支持!

近日,Rancher Labs宣布加强对Prometheus的支持,提高Kubernetes集群的可见度。Rancher也因此成为唯一一个在多集群、多租户环境中支持Prometheus的解决方案。 Prometheus正迅速成为监控云原生...

RancherLabs
46分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部