在开发中,由于某些需求,我们可能需要做一些平移,缩放,旋转甚至三维变换,所以我来讲讲在UWP中这些变换的实现方法。

一、

  二维变换:

UIElement.RenderTransform

  a、TranslateTransform,平移:

    属性:X,Y我相信大家都知道怎么用,这里就不讲废话了

  b、RotateTransform,旋转:

    属性:Angle

  c、ScaleTransform,缩放:

    属性:ScaleX,ScaleY

  d、SkewTransform,扭曲:

    属性:AngleX,AngleY

  e、MatrixTransform,矩阵变换

    Xmal用法:

<MatrixTransform Matrix="M11 M12 M21 M22 X Y">

    这个就稍微复杂一点,理论上可以做任何变换。说起来复杂,其实也就是一个变换矩阵而已

矩阵M:

M11 M12 0
M21 M22 0
  X   Y 1

我想,学过线性代数的应该都知道了吧,就是矩阵的乘法;假设点p0(x0,y0),则变换后的点为p1=[x0,y0,1]*M:

    x1 =  x0 * M11 + x0 * M21 + X ;

    y1 = y0 * M12 + y0 * M22 + Y;

  p1(x1,y1).

ps:矩阵的点乘简单的说就是行*列相加,也就是说假如矩阵X点乘Y,则X的列数必须等于Y的行数。

额外的,如果需要同时做多种变换,UWP提供了两种方法:

  1.TransformGroup,变换群组:

    

           <TransformGroup>
<RotateTransform />
<ScaleTransform />
</TransformGroup>

因为在RenderTransform下只能有一个子元素,所以当需要同时用多种变换时需要一个TransfromGroup。

  2.CompositeTransform,复合变换:

    属性:TranslateX,TranslateY,Rotate等

需要注意的是,变换是需要一个中心点的,这里UWP提供了两种设置中心点的方法:

  1.RenderTransformOrigin:

    这个属性为需要变换的控件的属性而非RenderTransform的属性,其值为Point(x,y).在控件内的值为0-1,大于1时,变换中心将处于控件外甚至布局之外。

  2.CenterX,CenterY:

    设置绝对X轴和Y轴的值,这里为绝对值而非相对值。

  建议使用前者。在大多数情况下,我们并不知道控件的具体大小,而前者使用的是相对值所以无论是代码量还是计算量都要优于后者。

二、

  三维变换:

 UIElement.Projection

  a、PlaneProjection

    属性:CenterOfRotationX,CenterOfRotationY,CenterOfRotationZ; 旋转的中心点 P(x,y,z)

         GlobalOffsetX,GlobalOffsetY,GlobalOffsetZ; 世界坐标系的平移

         LocalOffsetX,LocalOffsetY,LocalOffsetZ; 局部坐标系

         RotationX,RotationY,RotationZ; 分别绕X,Y,Z轴的旋转角度

如果不明白为什么有两个坐标系,参照 《三维图形系统中两种坐标系之间的坐标变换》。

  b、Matrix3DProjection

    Xaml用法:

<Matrix3DProjection  ProjectionMatrix=    "M11,M12,M13, 0,
M21,M22,M23, ,
M31,M32,M33, ,
X , Y , Z , "/>

    和上面二维矩阵变换类似,只是增加了一个维度而已:

矩阵M:

M11 M12 M13 0
M21 M22 M23 0
M31 M32 M33 0
X  Y Z 1

  设点 p0(x0,y0,z0),则变换后的点为:p1=[x0,y0,z0,1]*M

    x1=x0*M11+x0*M21+x0*M31+1*X;

    y1=y0*M12+y0*M22+Y0*M32+1*Y;

    z1=z0*M13+z0*M23+z0+M33+1*Z;

  p1(x1,y1,z1).

好了,基本讲完了,如果你说矩阵部分还是没看懂,我只能说你真的需要学习了。

UWP开发-二维变换以及三维变换的更多相关文章

  1. iOS开发-二维码扫描和应用跳转

    iOS开发-二维码扫描和应用跳转   序言 前面我们已经调到过怎么制作二维码,在我们能够生成二维码之后,如何对二维码进行扫描呢? 在iOS7之前,大部分应用中使用的二维码扫描是第三方的扫描框架,例如Z ...

  2. Android开发--二维码开发应用(转载!)

    android项目开发 二维码扫描   基于android平台的二维码扫描项目,可以查看结果并且链接网址 工具/原料 zxing eclipse 方法/步骤   首先需要用到google提供的zxin ...

  3. TurboCAD Pro for Mac(二维绘图和三维建模工具)破解版安装

    1.软件简介    TurboCAD Pro 是 macOS 系统上一款二维绘图和三维建模工具,具备强大的绘图和设计特性,加上强大的创建复杂的三维模型的工具,三维 OpenGL 的渲染,和超过 11, ...

  4. php基础------将二维数组转三维数组

    将二维数组转为三维数组 /** * 二维数组转三维数组(指定键为三维数组的键名) * @param [type] $arr [要排序的数组] * @param [type] $key [指定的键] * ...

  5. openGL实现二维图形和三维图形

    openGL是一个强大的底层图形库,其命令最初的时候使用C语言实现的.openGL定义了一个图形程序接口,常用于制作处理三维图像,功能强大,调用方便,在图像处理十分受欢迎. 实现图形主要使用的是ope ...

  6. SuperMap 二维地图和三维场景弹窗窗口大小控制

    注:此处所说的弹窗窗口,主要指的是那些弹窗窗口中嵌入iframe,包含信息页面的窗口大小控制. 1.首先来了解下 SuperMap 示例中的处理方案 二维的处理方式 //初始化Anchored类 po ...

  7. ipad开发:二维码扫描,摄像头旋转角度问题解决办法

    之前一直是在手机上开发,用系统原生二维码扫描功能,一点问题都没有,但是在ipad上,用户是横屏操作的,虽然界面旋转了,是横屏的,但是摄像头里显示的依然是竖屏效果,也就是说从摄像头里看到的和人眼看到的内 ...

  8. H5混合开发二维码扫描以及调用本地摄像头

    今天主管给了我个需求,说要用混合开发,用H5调用本地摄像头进行扫描二维码,我之前有做过原生安卓的二维码扫一扫,主要是通过调用zxing插件进行操作的,其中还弄了个闪光灯.但是纯H5的没接触过,心里没底 ...

  9. [二维码开发]二维码开发入门级demo

    最近开发一个项目,涉及到二维码开发,于是乎就到网上找下直接可用的资源,遇到两个问题: 1.网上资源不够完整,找到完整的资源,需要下载分,这个你知道的 2.ThoughtWorks.QRCode版本不对 ...

随机推荐

  1. ADT bundle和Eclipse和Android Studio有什么区别?安卓开发该用哪个?

    这三个版本的出现有一定的历史的原因:1.最开始只有eclipse+独立的adt一种开发环境,但是由于eclipe作为一种通用的ide,带来的问题太多,经常出现eclipse的版本不兼容adt的情况,或 ...

  2. expdp小记

    一.10.2.0.5要求expdp导出a用户b表空间下的数据. expdp \'/ as sysdba\' directory=mydir dumpfile=1.dmp schemas=a exclu ...

  3. 使用 IntraWeb (39) - THttpRequest、THttpReply

    在其它服务器脚本语言中熟悉的 Request.Response(THttpRequest.THttpReply) 在 IntraWeb 中算是幕后英雄了, 用户基本不需要直接操作它们了. IW 默认 ...

  4. 子元素的div不继承父元素的透明度

    问题一: 如何让logo部变成这样: 步骤一:先收一个大的div,上面logo+nav再一个div,下面是三个div横排着: 步骤二:最主要的是如何让上面的部分变暗,而logo的颜色不变暗? 答案:在 ...

  5. aix 6+ mount 光驱

    AIX 挂载光驱的方法 系统环境: [root@Big A:/1]#oslevel -s6100-06-00-0000 [root@Big A:/]#crfs -v cdrfs -p ro -d '/ ...

  6. [VBS]脚本中的字典、动态数组、队列和堆栈

    今天用VBS脚本写了几个程序,用到了字典(Dictionary).动态数组(ArrayList).队列(Queue)和堆栈(Stack).现在写篇Blog总结一下 :-) 1.编写环境 今天突发奇想下 ...

  7. FastReport代码计算高度

    Dim iHeight As Double        Dim columnData_form As DataSourceBase             iHeight=Page1.TopMarg ...

  8. lvs主备可以自由切换,vip落在主上的时候,端口无法telnet,业务连接不了

    lvs主备可以自由切换,vip落在主上的时候,端口无法telnet,业务连接不了 解决:将主上的keepalived重启,故障解除 原因:不可知 lvs常见故障原因: real server上的脚步没 ...

  9. jQuery in action 3rd - Introducing jQuery

    2014 年 10 月, jQuery Foundation 的总裁 Dave Methvin 发布了一篇博客(http://blog.jquery.com/2014/10/29/jquery-3-0 ...

  10. Oracle11G R2用exp无法导出空表解决方法

    在11G R2中有个新特性,当表无数据时,不分配segment,以节省空间Oracle当然在执行export导出时,空表则无法导出,但是还是有解决办法的: 解决方法: 一.insert一行,再roll ...