WPF中的MatrixTransform 
                                                                             周银辉

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

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

1,缩放操作
观察下面的矩阵乘法

如果我们用[2   5]代表点(2,5),我们发现其乘以一个矩阵后变成了[4,5],与之对应的点是(4,5),这相当与其X坐标变成了原来的两倍。
同理:

经过矩阵乘法后点(2,5)的Y坐标变成了原来的两倍(2,10)。

我们可以总结出这样的结论:

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

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


向量(-5,2)相当于是向量(2,5)按照顺时针方向旋转了90度。
但这里并没有总结出向缩放一样的简单结论,但我们可以知道,我们可以使用如下的2X2矩阵:

来对点进行线性变换(旋转,缩放。注意:平移变换不是线性变换),即将点对应的矩阵乘以该线性变换矩阵便可。

3,平移操作
在矩阵加法中:

我们可以发现点(3,5)实际是在点(2,5)的基础上想X方向平移1一个单位。
同理,

点(2,6)实际是在点(2,5)的基础上想Y方向平移1一个单位。
我们可以得到如下结论:
我们可以使用点对应的矩阵加上如下的矩阵

来实现平移操作,其中offsetX实现了X轴方向上的平移,offsetY实现了Y方向上的平移。

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

上面的这种变换称为仿射变换(affine transformation)

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

其实我们更希望将仿射变换中的几个矩阵存储到一个矩阵中来,一种较好的方式是将变换用到的2X2矩阵变成3X3矩阵,这也就是为什么我们WPF中的变换矩阵是3X3的。
在如下矩阵中:

其中M11,M12,M21,M22就来自于线性变换矩阵,用于指示旋转缩放等线性变换;X, Y来自与平移矩阵,用于指示平移变换。
由于最右边一列始终是001,所以WPF中的MatrixTransform类的构造函数仅仅需要指定6个参数。

WPF中的MatrixTransform相关推荐

  1. WPF中ControlTemplate和DataTemplate的区别

    原文:WPF中ControlTemplate和DataTemplate的区别 下面代码很好的解释了它们之间的区别: <Window x:Class="WPFTestMe.Window1 ...

  2. WPF中获取鼠标相对于桌面位置

    原文:WPF中获取鼠标相对于桌面位置 var transform = PresentationSource.FromVisual(this).CompositionTarget.TransformFr ...

  3. WPF中StringFormat的用法

    原文:WPF中StringFormat的用法 WPF中StringFormat的用法可以参照C#中string.Format的用法 1. C#中用法: 格式化货币(跟系统的环境有关,中文系统默认格式化 ...

  4. WPF中对三维模型的控制

    原文:WPF中对三维模型的控制 (以下选自南开大学出版社出版的<WPF和Silverlight教程>) 3Dmax中的建模模型可以导出为obj文件格式,将此文件导入WPF项目中,由WPF完 ...

  5. WPF中触发器Trigger、MultiTrigger、DataTrigger、MultiDataTrigger、EventTrigger几种

    WPF中有种叫做触发器的东西(记住不是数据库的trigger哦).它的主要作用是根据trigger的不同条件来自动更改外观属性,或者执行动画等操作. WPFtrigger的主要类型有:Trigger. ...

  6. WPF中Binding使用StringFormat格式化字符串方法

    原文:WPF中Binding使用StringFormat格式化字符串方法 货币格式 <TextBlock Text="{Binding Price, StringFormat={}{0 ...

  7. WPF中获取鼠标相对于屏幕的位置

    WPF中获取鼠标相对于屏幕的位置                                   周银辉 WPF编程时,我们经常使用Mouse.GetPosition(IInputElement ...

  8. WPF中的动画——(二)From/To/By 动画

    原文:WPF中的动画--(二)From/To/By 动画 我们所实现的的动画中,很大一部分是让一个属性在起始值和结束值之间变化,例如,我在前文中实现的改变宽度的动画: var widthAnimati ...

  9. 在WPF中使用WinForm控件方法

    在WPF中使用WinForm控件方法 原文:在WPF中使用WinForm控件方法 1.      首先添加对如下两个dll文件的引用:WindowsFormsIntegration.dll,Syste ...

最新文章

  1. 华人首位!许晨阳获2021年美国数学会代数领域最高奖
  2. 如果不能调试存储过程
  3. JavaScript程序员必备的5个debug技巧
  4. 【渝粤教育】 国家开放大学2020年春季 2064管理学基础 参考试题
  5. pku1192 最优连通子集
  6. 勉强算是面经——1.诺瓦科技
  7. 1.数独游戏(生成题目解唯一)
  8. matlab画平滑曲线的两种方法
  9. 边城工具集:绘图及标注工具
  10. CartoonShader
  11. 【Python爬虫网站数据实战】Python爬虫 统计淘宝商品数据+数据可视化
  12. (附源码)springboot电子病历管理APP 毕业设计 010350
  13. asp.net通用的sql插入与修改语句,一劳永逸
  14. 各国商圈json数据及mysql文件
  15. 2021年起重机械指挥复审模拟考试及起重机械指挥考试试题
  16. 为什么浏览器请求一个接口有两次其中一次是Request Method: OPTIONS
  17. 轻轻松松磁盘整理巧用UltimateDefrag软件
  18. 实对称阵的谱半径是连续函数
  19. 看完这妹纸的日更作业,网友直呼:中国计算机界的神!
  20. python图片RGBA转RGB

热门文章

  1. cent卸载mysql_centos 7.x 安装/卸载MySQL
  2. js remove 当前元素_D3.js入门教程
  3. js中的toString方法
  4. Python中的super()用法
  5. 浅析linux容器--Docker
  6. 计算机专业学嵌入式好吗?嵌入式到底该怎样学呢?
  7. 【MySQL】MySQL的事务
  8. 图论-无向图的连通性(POJ1144)(POJ3352)
  9. 模板 - DP动态规划
  10. c语言信号灯作用,交通信号灯对交通领域的作用与影响