UWP开发-二维变换以及三维变换
在开发中,由于某些需求,我们可能需要做一些平移,缩放,旋转甚至三维变换,所以我来讲讲在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开发-二维变换以及三维变换的更多相关文章
- iOS开发-二维码扫描和应用跳转
iOS开发-二维码扫描和应用跳转 序言 前面我们已经调到过怎么制作二维码,在我们能够生成二维码之后,如何对二维码进行扫描呢? 在iOS7之前,大部分应用中使用的二维码扫描是第三方的扫描框架,例如Z ...
- Android开发--二维码开发应用(转载!)
android项目开发 二维码扫描 基于android平台的二维码扫描项目,可以查看结果并且链接网址 工具/原料 zxing eclipse 方法/步骤 首先需要用到google提供的zxin ...
- TurboCAD Pro for Mac(二维绘图和三维建模工具)破解版安装
1.软件简介 TurboCAD Pro 是 macOS 系统上一款二维绘图和三维建模工具,具备强大的绘图和设计特性,加上强大的创建复杂的三维模型的工具,三维 OpenGL 的渲染,和超过 11, ...
- php基础------将二维数组转三维数组
将二维数组转为三维数组 /** * 二维数组转三维数组(指定键为三维数组的键名) * @param [type] $arr [要排序的数组] * @param [type] $key [指定的键] * ...
- openGL实现二维图形和三维图形
openGL是一个强大的底层图形库,其命令最初的时候使用C语言实现的.openGL定义了一个图形程序接口,常用于制作处理三维图像,功能强大,调用方便,在图像处理十分受欢迎. 实现图形主要使用的是ope ...
- SuperMap 二维地图和三维场景弹窗窗口大小控制
注:此处所说的弹窗窗口,主要指的是那些弹窗窗口中嵌入iframe,包含信息页面的窗口大小控制. 1.首先来了解下 SuperMap 示例中的处理方案 二维的处理方式 //初始化Anchored类 po ...
- ipad开发:二维码扫描,摄像头旋转角度问题解决办法
之前一直是在手机上开发,用系统原生二维码扫描功能,一点问题都没有,但是在ipad上,用户是横屏操作的,虽然界面旋转了,是横屏的,但是摄像头里显示的依然是竖屏效果,也就是说从摄像头里看到的和人眼看到的内 ...
- H5混合开发二维码扫描以及调用本地摄像头
今天主管给了我个需求,说要用混合开发,用H5调用本地摄像头进行扫描二维码,我之前有做过原生安卓的二维码扫一扫,主要是通过调用zxing插件进行操作的,其中还弄了个闪光灯.但是纯H5的没接触过,心里没底 ...
- [二维码开发]二维码开发入门级demo
最近开发一个项目,涉及到二维码开发,于是乎就到网上找下直接可用的资源,遇到两个问题: 1.网上资源不够完整,找到完整的资源,需要下载分,这个你知道的 2.ThoughtWorks.QRCode版本不对 ...
随机推荐
- Mysql导入数据库的方法
mysql导入数据库的方法 | 浏览:41023 | 更新:2012-11-01 19:45 1 2 3 4 5 6 7 分步阅读 MySQL是一个中.小型关系型数据库管理系统,由瑞典MySQL AB ...
- Android(Xamarin)之旅(二)
新的一年,新的开始,2016,我要做什么,大家要做什么,啦啦啦. OK,上篇已经介绍了几个简单的控件,这次,我们继续说说控件.但是可能有人认为这有什么难的,问题不在这里,而在于,如果你注意了每一个空间 ...
- 《UML大战需求分析》阅读笔记3
流程分析利器--活动图 活动图属于行为建模的一种.用来分析的不是系统中的某个属性,而是系统或是其中某个部分的活动.结构建模表达的是静态内容,行为建模表达的是动态内容. 在介绍活动图之前,先介绍一下行为 ...
- apache的80端口分发
打开 conf 文件夹,找到下面的 httpd.conf 更改Listen 后面的端口号为:80:默认就是80端口 去掉下面的相关注释: #LoadModule proxy_module module ...
- 有关big.LITTLE,你需要知道的十件事情
来源 问题 1:该技术能够同时打开所有核心吗? 在早期的 big.LITTLE 软件模型中(集群迁移和 CPU 迁移),软件在核心之间切换,不能同时打开所有核心.在更新的软件模型“全局任务调度”中 ...
- nodejs: C++扩展
Nodejs的C++扩展首先保证nodejs和v8都正确安装 下载NodeJS源码,我的放在D盘. NodeJS的C++扩展要用VS2010开发,新建一个空的Win32控制台项目,右键——属性,在常规 ...
- 【Visual Lisp】Visual Lisp属性与方法
说明:Visual Lisp属性的获取.赋值和方法的执行有多种形式.然而对于初学者来说一次性就要全部掌握显然是没有必要的,有时候每种方法都是通用的功能都一样我们就没有必要把所有方法都记住.我们只需要掌 ...
- App技术框架
一.App技术框架的类型 图1 三种App技术框架之间的关系 目前App的技术框架基本分为三种(图1): (1)Native App:互动型,iOS.Android.WP各一套,而且要维护历史版本,要 ...
- stringbuffer与stringbuilder与String
1. 在执行速度方面的比较:StringBuilder > StringBuffer 2. StringBuffer与StringBuilder,他们是字符串变量,是可改变的对象,每当我们用它们 ...
- 大数据处理对象CLOG BLOG
File 文件类的使用 decimal 类型(规范小数的形式) longtext 类型(存储字符大数据) 存入文本文件到数据库 InputStream FileInputStream CLOG 类的 ...