对各种transform的讲解已经很多了,但是有时MatrixTransform和其他transform变换效果之间需要转换时,变换量的转换又如何呢?下面的类就完成了Matrix和其他transform的转换方法。

        public static ScaleTransform GetScaleByMatrix(Matrix matrix)
{
ScaleTransform scaleTransform = new ScaleTransform();
scaleTransform.ScaleX = matrix.M22;
scaleTransform.ScaleY = matrix.M11;
return scaleTransform;
}
public static double GetRotateByMatrix(Matrix matrix)
{
double rotate = Math.Acos(matrix.M11);
return rotate;
}
public static TranslateTransform GetTranslateByMatrix(Matrix matrix)
{
TranslateTransform translate = new TranslateTransform();
translate.X = matrix.OffsetX;
translate.Y = matrix.OffsetY;
return translate;
}
public static Matrix GetMatrixByScale(ScaleTransform scale)
{
return new Matrix(scale.ScaleY, , , scale.ScaleX, , );// x or y ???
}
public static Matrix GetMatrixByRotate(double rotate)
{
return new Matrix(Math.Cos(rotate), -Math.Sin(rotate), Math.Sin(rotate), Math.Cos(rotate), , );
}
public static Matrix GetMatrixByTranslate(TranslateTransform translate)
{
return new Matrix(, , , , translate.X, translate.Y);
}

在二位平面的平移变换中, TranslateTransform中的 X 和 Y 值分别对用MatrixTransform 中的OffsetX 和OffsetY, 但是对于RotateTransform 进行平面旋转的时候,他的三个参数Angle,CenterX,CenterY怎么对应到MatrixTransform中呢?在上面的函数 GetMatrixByRotate(a)可以把角度映射到Matrix中,但如果这做了Angle的转换,图片的旋转是默认的左上角点,但是我们的需求并不是左上角,那怎么按照我们设定的centerX 和CenterY来旋转呢?经过研究,找到一个比较笨拙的办法,目前还未找到更好的算法。

   private Matrix GetMatrixByPrimaryCenterRotate(Point primaryCenter, Matrix target)
{
MatrixTransform mt = new MatrixTransform() { Matrix = target };
Point newCenter = mt.Transform(primaryCenter);
target.OffsetX = primaryCenter.X - newCenter.X;
target.OffsetY = primaryCenter.Y - newCenter.Y;
return target;
}

通过GetMatrixByRotate(a)方法我们可以计算出旋转angle后的Matrix,然后通过translateTransform 把旋转对象移回到中心旋转的效果,上面的方法可以计算出指定旋转中心的旋转效果。

对于同时进行ScaleTransform和RotateTransform的效果怎么计算呢?

对这样的效果我们对得到的不同的Matrix进行矩阵相乘即可得到混合变换合并之后的MatrixTransform.

See Also: http://msdn.microsoft.com/en-us/library/8667dchf(v=vs.110).aspx

Silverlight 中MatrixTransform和其他Transform的数值转换的更多相关文章

  1. Silverlight中动画的性能浅析

    Silverlight中提供了StoryBoard实现动画,可是StoryBoard的性能实在不敢恭维,特别是动画很大的时候,计算机的CPU和内存的狂增,如此一来性能实在太差,在默认的动画效果中动画实 ...

  2. Silverlight中的拖拽实现的图片上传

    原文 http://blog.csdn.net/dujingjing1230/article/details/5443003 在Silverlight中因为可以直接从系统的文件夹里面拖出来一个文件直接 ...

  3. WPF/Silverlight中图形的平移,缩放,旋转,倾斜变换演示

    原文:WPF/Silverlight中图形的平移,缩放,旋转,倾斜变换演示 为方便描述, 这里仅以正方形来做演示, 其他图形从略. 运行时效果图:XAML代码:// Transform.XAML< ...

  4. 用C3中的animation和transform写的一个模仿加载的时动画效果

    用用C3中的animation和transform写的一个模仿加载的时动画效果! 不多说直接上代码; html标签部分 <div class="wrap"> <h ...

  5. Silverlight中文本框添加回车事件后,换行无法清除的解决方法

    在开发Silverlight的项目中,为了更好的用户体验,我们常要给一些控件添加一些快捷键.然而,在Silverlight中当用户回车提交后,光标停留在文本框的第二行怎么也清除不掉,经过一段时间研究, ...

  6. SharePoint 2013 Silverlight中使用Net客户端对象模型

    1.创建Silverlight时,选择Silverlight 4,不要选择版本5,试了很久版本5都调用不了,自己也不知道什么原因,谷歌也没找到答案,后来尝试版本4,可以调用: 至于Host the S ...

  7. Silverlight中的TabControl如何绑定数据?重写tabcontrol和tabItem 解决绑定友好问题。可以绑定对象集合

    在 WPF 中,TabControl 可以直接将 ItemsSource 绑定数据源,见 将 TabControl 绑定到数据的示例 http://msdn.microsoft.com/zh-cn/l ...

  8. ArcGIS API for Silverlight中加载Google地形图(瓦片图)

    原文:ArcGIS API for Silverlight中加载Google地形图(瓦片图) 在做水利.气象.土地等行业中,若能使用到Google的地形图那是再合适不过了,下面就介绍如何在ArcGIS ...

  9. 在Silverlight中实施RESTful调用

    在Silverlight中实施RESTful调用:   http://book.51cto.com/art/201006/206314.htm    http://bbs.csdn.net/topic ...

随机推荐

  1. NotePad++安装和配置C/C++开发插件

    NotePad++ - 安装和配置C/C++开发插件 | NotePad++ - Install and Configure plugins for develop C/C++ http://aofe ...

  2. gcc编译器优化给我们带来的麻烦???

    gcc编译器优化给我们带来的麻烦??? 今天看到一个很有趣的程序,如下: ? 1 2 3 4 5 6 7 8 9 int main() {     const int a = 1;     int * ...

  3. npm 安装与常用命令

    下载nodejs并安装,会附带安装npm工具https://nodejs.org/en/download/ npm 常用命令#在执行命令时需要管理员权限,mac请用sudo来执行,windows请使用 ...

  4. VC中如何设置菜单项的触发状态?

    MFC中初始菜单栏如下: 当工程未新建,或者未打开时,后面的观测菜单设置为灰色,不可触发. 当新建工程或者打开工程后,菜单变回可触发状况. 观测菜单如下:   下面以轴力观测菜单为例 轴力初始测量菜单 ...

  5. 基于libgdx游戏引擎开发的飞天猫

    闲来没事学学游戏,这是鄙人第一个小游戏——飞天猫 1,基于Android开发的小游戏,至少Android2.2以上的系统. 2,界面简洁,美观,游戏易操作,上手快. 3,可以左右摇摆手机来改变飞天猫的 ...

  6. Android 经验: 5555 端口会被 adb 误认为 emulator

    在本机启动 Android, 再用本机的的 adb 去连接 adb connect 127.0.0.1:5555 而后 adb devices 查看 user@ubuntu:~$ adb device ...

  7. <我的外骨骼,诺基>后的访谈

    <我的外骨骼,诺基>后的访谈 在接下采访任务之前,我对杨贵福的了解仅仅限于:有名的科幻作家,男性,成年.我虽然读过他的许多作品,但在这些作品中并不能找到作者的影子.我试着从作品的行文风格中 ...

  8. C语言之函数的介绍

    函数的介绍 遇到的问题: 1.代码看起来特别多,不简洁 2.修改起来非常麻烦,需要所有用到的地方都修改 函数就可以解决上述这两个问题 函数可以理解为一个打包带,就是把一段代码打包起来,用到的时候只要写 ...

  9. iOS之上架打包时报错:ERROR ITMS-90086: "Missing 64-bit support.

    根据错误信息在网上基本找到的解决方法是设置targets中build settings中的architectures中的内容 这是因为现在提交的app必须支持64位.  

  10. sql Cursor的用法

    table1结构如下 id int name ) declare @id int ) declare cursor1 cursor for --定义游标cursor1 select * from ta ...