[C#参考]Matrix类


想要从入门到精通一门语言,最好的学习文档就是官方提供的文档,比如说OpenCV的学习,最权威的学习资料还是其官方的学习文档,C#和.net的最好的学习入门文档还是MSDN。但是好多人一开始真的不会用,所以忽略了这宝贵的材料,而去学习一些其它的乱七八糟的资料或者书籍。

我也是刚了解到MSDN的一个使用技巧:如果你想查一个类的用法或者一些类的用法,直接在MSDN中找这个类所在的命名空间,它能告诉你相关的好多东西。下面就来开一下在System.Drawing.Drawing2D这个命名空间下的Matrix类。


概述:

这个类封装表示几何变换的3x3仿射矩阵。此类不能被继承。

命名空间:System.Drawing.Drawing2D

程序集:System.Drawing(在System.Drawing.dll中)


用法:

在GDI+中,可以在Matrix对象中存储仿射变换。由于表示仿射变换的矩阵的第三列总是(0,0,1),因此在构造Matrix对象时,只需要指定前两列的6个数。语句:

Matrix myMatrix = new Matrix(0, 1, -1, 0, 3, 4) 

构造下面图形中显示的矩阵。[C#参考]Matrix类


复合变换

复合变换是一个接一个的变换序列,看看下面列表中的矩阵和变换(矩阵的本质是其所在空间的一种跃迁(变换)):

矩阵A 旋转90度
矩阵B 在x方向上缩放2倍
矩阵C 在y方向上平移3个单位

 

在仿射空间中,如果从由矩阵[2 1 1]表示的点(2,1)开始,先后乘以A、B、C,在点(2,1)将按列出的顺序经历三种变换。

[2 1 1]ABC = [-2 5 1]

可以不将复合变换的三部分存储于三个独立的矩阵,而是一起乘以A、B和C来得到存储整个复合变换的单个的3x3矩阵。假定ABC=D,则一个点乘以D得出的结果与一个点先后乘以A、B、C的结果相同。

[2 1 1]D = [-2 5 1]

下图显示了矩阵A、B、C和D

[C#参考]Matrix类

复合变换的矩阵可以通过将几个单独的变换矩阵相乘而得到,这就意味着任何仿射变换的序列均可存储于单个的Matrix对象中。

注意:复合变换的顺序非常的重要。一般来说,先旋转、在缩放、然后平移,与先缩放、再旋转、然后平移是不同的。同样,矩阵相乘的顺序也是重要的。这就对应着矩阵ABC与BAC一般不同。

Matrix类提供了几种构建复合变换的过程:Multiply、RotateAt、Rotate、Scale、Shear和Translate。下面的示例创建了一个复合变换(先选装30度,再在y方向上缩放2倍,让后在x方向上平移5个单位)的矩阵。

Matrix myMatix = new Matix();//将Matrix类的一个新实例初始化为单位矩阵
myMatrix.Rotate(30);
myMatix.Scale(1, 2, MatrixOrder.Append);
myMatix.Translate(5, 0, MatrixOrder.Append);

其中MatrixOrder的两个属性还不知道具体怎么玩?以后探讨。

链接地址:https://msdn.microsoft.com/zh-cn/library/system.drawing.drawing2d.matrix(v=vs.110).aspx

https://msdn.microsoft.com/zh-cn/library/system.drawing.drawing2d.matrixorder(v=vs.110).aspx

[C#参考]Matrix类

上一篇:WPF中关于自定义控件的滚动条鼠标停留在内容上鼠标滚轮滚动无效的问题


下一篇:解决win7下vc6.0打开添加文件错误 崩溃