[转]WPF中的MatrixTransform

简介: 原文:http://www.cnblogs.com/zhouyinhui/archive/2007/07/07/809553.html  yjmyzz提示:读懂以下内容可能需要掌握(高中)数学中的"向量运算",以及(大学)数学“线性代数”中的"矩阵运算",如果您对此不熟悉,建议先百度词条温习一下。

原文:http://www.cnblogs.com/zhouyinhui/archive/2007/07/07/809553.html 

yjmyzz提示:读懂以下内容可能需要掌握(高中)数学中的"向量运算",以及(大学)数学“线性代数”中的"矩阵运算",如果您对此不熟悉,建议先百度词条温习一下。 

虽然在WPF中可以使用TranslateTransform、RotateTransform、ScaleTransform等进行几何变换,但我们也可以使用更底层的MatrixTransform(矩阵变换)来进行更复杂的复合变换。

首先我们矩阵如何影响几何变换的:

1,缩放操作
观察下面的矩阵乘法
matrix1.png
如果我们用[2   5]代表点(2,5),我们发现其乘以一个矩阵后变成了[4,5],与之对应的点是(4,5),这相当与其X坐标变成了原来的两倍。
yjmyzz注:见下图
img_21005c6e9360fbdbd62f74df7b632a10.jpg
同理:
matrix2.png
经过矩阵乘法后点(2,5)的Y坐标变成了原来的两倍(2,10)。
yjmyzz注:见下图
img_608eea8e50325f809f3ca8ef0b280fb1.jpg
我们可以总结出这样的结论:
matrix3.png

可以将矩阵的第二和第三个元素设置为0并用矩阵中M11和M22来进行缩放操作,其中M11是对X坐标进行缩放,M22是对Y坐标进行缩放

2,旋转操作
观察下面的矩阵乘法:

matrix4.png
向量(-5,2)相当于是向量(2,5)按照时针方向旋转了90度。

yjmyzz注:见下图
img_8998cc02d890afcadc570e626084326b.jpg

但这里并没有总结出向缩放一样的简单结论,但我们可以知道,我们可以使用如下的2X2矩阵:
matrix5.png
来对点进行线性变换(旋转,缩放。注意:平移变换不是线性变换),即将点对应的矩阵乘以该线性变换矩阵便可。

3,平移操作
在矩阵加法中:
matrix6.png
我们可以发现点(3,5)实际是在点(2,5)的基础上想X方向平移1一个单位。
同理,
matrix7.png
点(2,6)实际是在点(2,5)的基础上想Y方向平移1一个单位。
我们可以得到如下结论:
我们可以使用点对应的矩阵加上如下的矩阵
matrix8.png
来实现平移操作,其中offsetX实现了X轴方向上的平移,offsetY实现了Y方向上的平移。

4,几种操作的融合
如果仅仅是简单的单一操作(仅旋转或仅平移等)我们就没有必要在这里进行讨论了。现在我们需要将几种几何变换揉合在一起,比如平移对象的同时旋转对象等,我们可以将矩阵乘法与加法揉合在一起进行混合运算。比如向量(2,3)先进行缩放和旋转后再分别在X与Y轴方向上平移了5个与6个单位
matrix9.png
上面的这种变换称为仿射变换(affine transformation)

注意:这种几何变换在操作的先后顺序上是需要注意的,不同的操作次序可以带来不同的结果,比如上面的例子,如果我们先进行平移操作后进行缩放与旋转将得到如下结果:
matrix10.png

其实我们更希望将仿射变换中的几个矩阵存储到一个矩阵中来,一种较好的方式是将变换用到的2X2矩阵变成3X3矩阵,这也就是为什么我们WPF中的变换矩阵是3X3的。
在如下矩阵中:
matrix11.png
其中M11,M12,M21,M22就来自于线性变换矩阵,用于指示旋转缩放等线性变换;X, Y来自与平移矩阵,用于指示平移变换。
由于最右边一列始终是001,所以WPF中的MatrixTransform类的构造函数仅仅需要指定6个参数。

yjmyzz注:演示

目录
相关文章
C#编程-126:WPF初步
C#编程-126:WPF初步
C#编程-126:WPF初步
WPF-ComplexLayout
WPF-ComplexLayout-DockPanel
238 0
WPF-ComplexLayout
|
C# Windows
WPF WriteableBitmap的使用
选中项目按右键添加-资源文件-WPF-窗口generate_bitmap.xml文件内容为
2086 0
|
C#
WPF“天狗食月”效果
原文:WPF“天狗食月”效果 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yangyisen0713/article/details/18596419 ...
714 0
|
C#
使用WPF实现3D场景[二]
原文:使用WPF实现3D场景[二] 在上一篇的文章里我们知道如何构造一个简单的三维场景,这次的课程我将和大家一起来研究如何用代码,完成对建立好了的三维场景的观察。
1080 0
|
C#
浅谈WPF中的PreviewTextInput
原文:浅谈WPF中的PreviewTextInput     今天在使用TextBox的TextInput事件的时候,发现无论如何都不能触发该事件,然后百思不得其解,最后在MSDN上找到了答案:TextInput 事件可能已被标记为由复合控件的内部实现进行处理。
1133 0
|
测试技术 C#
WPF DesiredSize & RenderSize
原文:WPF DesiredSize & RenderSize DesiredSize DesiredSize介绍 关于DesiredSize的介绍,可以查看最新微软文档对DesiredSize的介绍 DesiredSize,指的是元素在布局过程中计算所需要的大小。
981 0
|
C#
浅谈WPF的VisualBrush
原文:浅谈WPF的VisualBrush     首先看看VisualBrush的解释,msdn上面的解释是使用 Visual 绘制区域,那么我们再来看看什么是Visual呢?官方的解释是:获取或设置画笔的内容,Visual 是直接继承自DependencyObject,UIElement也是直接继...
1885 0
|
C# 索引
WPF MeshGeometry3D
原文:WPF MeshGeometry3D 说说 MeshGeometry3D 里 常用的 四个属性。 先看看 MSDN 的 简介 先说说 Positions,介绍说 是顶点位置的集合,什么意思,看张图片。
865 0