WPF中的平移缩放和矩阵变换(TranslateTransform、ScaleTransform、MatrixTransform)
在WPF中的平移缩放都是通过RenderTransform这个类来实现这些效果的,在这个类中,除了平移和缩放还有旋转、扭曲变换、矩阵变换。这些都差不多的,都是坐标的变换。
这里我就先简单弄个平移和缩放吧:
平移呢就是以原来的对象为坐标原点(0,0),然后向X轴、Y轴进行平移变换。缩放呢有几个属性,ScaleX、ScaleY属性表示对象在X、Y轴进行缩放的倍数,CenterX 和 CenterY属性指定一个中心点。
下面有一个平移和缩放的简单的demo,用鼠标拖图片放进行平移,点击按钮来进行缩放,同时在缩放时让图片回到窗口的中央:
<Grid Name="grid">
<Grid.Resources>
<TransformGroup x:Key="trasformView">
<ScaleTransform />
<TranslateTransform />
</TransformGroup>
</Grid.Resources>
<ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Disabled" Focusable="False">
<ContentControl MouseLeftButtonDown="OnMouseLeftButtonDown"
MouseLeftButtonUp="OnMouseLeftButtonUp"
MouseMove="OnMouseMove">
<Image Name="Image1" Source="Images/Picture.jpg" Stretch="Uniform"
RenderTransform="{StaticResource trasformView}" />
</ContentControl>
</ScrollViewer>
<StackPanel HorizontalAlignment="Right" VerticalAlignment="Bottom">
<Button Content="放大" Click="Button_Click_1" />
<Button Content="缩小" Click="Button_Click_2" />
</StackPanel>
</Grid>
分别处理MouseDown/Move/Up来达到移动,通过点击按钮然后控制ScaleX、ScaleY,CenterX 和 CenterY来放大缩小倍数和控制中心点:
private void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e) {
var image = sender as ContentControl;
if (image == null) {
return;
}
image.CaptureMouse();
ismouseLeftButtonDown = true;
this.mousePoint = e.GetPosition(image);
}
private void OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e) {
var image = sender as ContentControl;
if (image == null) {
return;
}
image.ReleaseMouseCapture();
ismouseLeftButtonDown = false;
}
private void OnMouseMove(object sender, MouseEventArgs e) {
var image = sender as ContentControl;
if (image == null) {
return;
}
if (ismouseLeftButtonDown) {
ImageMove(image, e.GetPosition(image));
}
}
private void ImageMove(ContentControl image, Point point) {
var group = grid.FindResource("trasformView") as TransformGroup;
var translateTransform = group.Children[] as TranslateTransform;
translateTransform.X += point.X - mousePoint.X;
translateTransform.Y += point.Y - mousePoint.Y;
mousePoint = point;
sumx = translateTransform.X;
sumy = translateTransform.Y;
}
private void ScalingAndtranslation(string str) {
var group = grid.FindResource("trasformView") as TransformGroup;
var scaleTransform = group.Children[] as ScaleTransform;
var translateTransform = group.Children[] as TranslateTransform;
var mainWindowPoint = new Point(window.ActualWidth / , window.ActualHeight / );
var imagePoint = new Point(Image1.ActualWidth / , Image1.ActualHeight / );
scaleTransform.CenterX = imagePoint.X;
scaleTransform.CenterY = imagePoint.Y;
if (str == "amplify") {
scaleTransform.ScaleX += 0.2;
scaleTransform.ScaleY += 0.2;
} else if (str == "reduce" && scaleTransform.ScaleX > 0.1) {
scaleTransform.ScaleX -= 0.2;
scaleTransform.ScaleY -= 0.2;
}
if (translateTransform.X != || translateTransform.Y != ) {
translateTransform.X = translateTransform.X - sumx;
translateTransform.Y = translateTransform.Y - sumy;
}
}
上面是用了TranslateTransform、ScaleTransform,还有一个MatrixTransform,这个是其他变换的底层的实现,是通过矩阵的运算来得到的。可以更加灵活的运动变换。
这个可以仔细的学习一下:
<MatrixTransform Matrix="M11 M12 M21 M22 OffsetX OffsetY"></MatrixTransform>
可以看到上面这个,Matrix里面的是什么意思呢,首先看简单的[OffsetX OffsetY]这两个。这两个是跟平移有关,很简单,就是一个简单的矩阵的加减法,比如[1,1]+[1,0]=[2,1]。这个就表示(1,1)这个点在X轴上平移一个单位可以到(2,1)。同理:[1,1]+[0,1]=[1,2]。这个就是在Y轴上平移一个单位。
然后来看缩放:
这个矩阵的乘法表示(1,2)这个点通过乘一个矩阵后变为(3,8),X轴变为原来3倍,Y轴变为4倍。
然后呢这个中间乘的矩阵就是上面M11和M22。就可以控制缩放的倍数。
同样的,剩下的两个
就是用来控制旋转的啦。
所以,就可以通过几个矩阵的结合来一次性的旋转、平移、缩放等等操作。上面都是2*2的矩阵,其实有3*3的矩阵的,就是本人数学较烂。就找个图贴贴总结下吧。
最终坐标:即是说最终坐标 (x1,y1) : x1 = x0 * M11 + x0 * M21 + OffsetX , y1 = y0 * M12 + y0 * M22 + OffsetY.
好了,这样MatrixTransform 就可以进行使用了。例子还没写=-= 以后补充吧。
先把上面那个简单的平移缩放的DEMO放着:NO1
WPF中的平移缩放和矩阵变换(TranslateTransform、ScaleTransform、MatrixTransform)的更多相关文章
- OpenGL中旋转平移缩放等变换的顺序对模型的影响
l 前提: 0x01. 假设绘制顶点的语句为Draw Array,变换的语句(旋转.平移.缩放)为M,而 M0; M1; M2; Draw Array; 则称对Array先进行M2再进行M1.M0 0 ...
- WPF/Silverlight中图形的平移,缩放,旋转,倾斜变换演示
原文:WPF/Silverlight中图形的平移,缩放,旋转,倾斜变换演示 为方便描述, 这里仅以正方形来做演示, 其他图形从略. 运行时效果图:XAML代码:// Transform.XAML< ...
- 二维图形的矩阵变换(三)——在WPF中的应用矩阵变换
原文:二维图形的矩阵变换(三)--在WPF中的应用矩阵变换 UIElement和RenderTransform 首先,我们来看看什么样的对象可以进行变换.在WPF中,用于呈现给用户的对象的基类为Vis ...
- 二维图形的矩阵变换(二)——WPF中的矩阵变换基础
原文:二维图形的矩阵变换(二)--WPF中的矩阵变换基础 在前文二维图形的矩阵变换(一)——基本概念中已经介绍过二维图像矩阵变换的一些基础知识,本文中主要介绍一下如何在WPF中进行矩阵变换. Matr ...
- WPF 中Canvas图形移动、缩放代码
从Flash转C#,很多内容一知半解,边摸索边前进,代码粗糙,权当留个脚印. 只是想得到一个基础的移动和缩放功能的界面,找了很久都是画线.画矩形等基础形状的代码,移动和缩放说的并不清晰,只能自己努力来 ...
- 在WPF中的Canvas上实现控件的拖动、缩放
如题,项目中需要实现使用鼠标拖动.缩放一个矩形框,WPF中没有现成的,那就自己造一个轮子:) 造轮子前先看看Windows自带的画图工具中是怎样做的,如下图: 在被拖动的矩形框四周有9个小框,可以从不 ...
- WPF中的MatrixTransform
原文:WPF中的MatrixTransform WPF中的MatrixTransform ...
- MSDN 杂志:UI 前沿技术 - WPF 中的多点触控操作事件
原文 MSDN 杂志:UI 前沿技术 - WPF 中的多点触控操作事件 UI 前沿技术 WPF 中的多点触控操作事件 Charles Petzold 下载代码示例 就在过去几年,多点触控还只是科幻电 ...
- WPF中的三维空间(2)
原文:WPF中的三维空间(2) 2.10.3 三维对象操作 1.在二维平面空间移动.缩放.旋转Viewport3D控件对象 图2-196 选中Viewport3D控件对象 图 ...
随机推荐
- Numba makes Python code fast
Numba: A High Performance Python Compiler http://numba.pydata.org/ 一行代码让python的运行速度提高100倍,你信吗?-聚能聊-云 ...
- 正则表达式 \b
引用网上一段话: \b 是正则表达式规定的一个特殊代码(好吧,某些人叫它元字符,metacharacter),代表着单词的开头或结尾,也就是单词的分界处.虽然通常英文的单词是由空格,标点符号或者换行来 ...
- 报错:Cannot remove entries from nonexistent file c:\program files\anaconda3\lib\site-packages\easy-install.pth
Outline 这两天通过“掘金量化终端”跑模型策略,之前装好环境一直ok,可以顺畅的Running~ 下午重装了下 Anaconda,刚才跑的时候提示 缺少“gm”模块 (掘金量化必须包): 就按照 ...
- Python基础教程-Dict和Set
Python的dict Python内置了字典:dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度. 比如,要根据同学的名字查找对应的 ...
- 简明python教程六----编写一个python脚本
备份程序: #!/usr/bin/python #Filename:backup_ver1.py import os import time source = ['/home/liuxj/python ...
- pandas(四)唯一值、值计数以及成员资格
针对Series对象,从中抽取信息 unique可以得到Series对象的唯一值数组 >>> obj = Series(['c','a','d','a','a','b','b','c ...
- nginx缓存原理
一.HTTP字段理解 1.Expires: 该字段的http1.0时的规范,值为一个绝对时间的GMT格式的时间字符串,代表缓存资源的过期时间,在这个时点之前即命中缓存. 缺点:服务器返回的时间,可能与 ...
- go——切片(二)
切片是一种数据结构,这种数据结构便于使用和管理数据集合. 切片是围绕动态数组的概念构建的,可以按需自动增长和缩小. 切片的动态增长是通过内置函数append来实现的.这个函数可以快速且高效地增长切片. ...
- React:快速上手(4)——掌握Redux(1)
React:快速上手(4)——掌握Redux 引入Redux 混乱的state管理 随着 JavaScript 单页应用开发日趋复杂,JavaScript 需要管理比任何时候都要多的 state (状 ...
- Python面试题之Python对象反射、类反射、模块反射
python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) 一.getattr 对象获取 class Manager: role = &quo ...