[转]矩阵变换原理

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

 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方向平移一个单位。

 同理,

 点(2,6)实际是在点(2,5)的基础上想Y方向平移一个单位。

 我们可以得到如下结论:

 我们可以使用点对应的矩阵加上如下的矩阵

 来实现平移操作,其中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个参数。

时间: 2024-08-03 18:14:12

[转]矩阵变换原理的相关文章

【Android进阶】(3)Android图像处理

1. 概念 色调/色相:物体传递的颜色 饱和度:颜色的纯度,从0(灰)到100%(饱和)来进行描写叙述 亮度/明度:颜色的相对明暗程度 2. 调整图像小Demo 创建一个工具类.用来设置图像的三种參数: /** * * @param bm * 图像 * @param hue * 色相 * @param saturation * 饱和度 * @param lum * 亮度 * @return */ public static Bitmap handleImageEffect(Bitmap bm,

从UIImage的矩阵变换看矩阵运算的原理

1.矩阵的基本知识: struct CGAffineTransform {  CGFloat a, b, c, d;  CGFloat tx, ty;}; CGAffineTransform CGAffineTransformMake (CGFloat a,CGFloat b,CGFloat c,CGFloat d,CGFloat tx,CGFloat ty); 为了把二维图形的变化统一在一个坐标系里,引入了齐次坐标的概念,即把一个图形用一个三维矩阵表示,其中第三列总是(0,0,1),用来作为坐

CGAffineTransformMake 矩阵变换 的运算原理

1.矩阵的基本知识: struct CGAffineTransform {  CGFloat a, b, c, d;  CGFloat tx, ty;}; CGAffineTransform CGAffineTransformMake (CGFloat a,CGFloat b,CGFloat c,CGFloat d,CGFloat tx,CGFloat ty); 为了把二维图形的变化统一在一个坐标系里,引入了齐次坐标的概念,即把一个图形用一个三维矩阵表示,其中第三列总是(0,0,1),用来作为坐

Silverlight学习之RenderTransform特效(五种基本变换)及(矩阵变换MatrixTransform)

RenderTransform特效: 变形(RenderTransform)类是为了达到直接去改变某个Silverlight对象的形状(比如缩放.旋转一个元素)的目的而设计的,RenderTransform包含的变形属性成员就是专门用来改变Silverlight对象形状的,它可以实现对元素拉伸,旋转,扭曲等效果,同时变形特效也常用于辅助产生各种动画效果,下面列出RenderTransform类的成员: l  TranslateTransform:能够让某对象的位置发生平移变化. l  Rotat

二维图形的矩阵变换(一)——基本概念

基本的二维变换可包括旋转.缩放.扭曲,和平移四种,              而这些几何运算则可以转换为一些基本的矩阵运算: 这几个变换都是线性的,但平移运算不是线性的,不能通过2*2矩阵运算完成.若要将点 (2, 1)在 x 方向将其平移 3 个单位,在 y 方向将其平移 4 个单位. 可通过先使用矩阵乘法再使用矩阵加法来完成此操作. 综合这几种基本运算,数学家们将其统一为一个3*3矩阵,存储形式如下: 由于表示仿射变换的矩阵的第三列总是(0,0,1),在存储矩阵的时候,大多只存成一个2*3的

WebGL学习系列-基础矩阵变换

前言 在图形学中,特别是涉及到3D的时候,矩阵变换起着非常重要的作用.在实际使用的过程当中,通常每一帧画面可能都会涉及到成千上万个顶点的坐标变换,如果没有矩阵变换计算,一个是计算复杂,一个是难以达到我们想要的计算效率.本小节将介绍通过矩阵计算来实现基本的图形变换. 矩阵 矩阵是一种多个数据集合的表示方式,定义为:由 m × n 个数aij排成的m行n列的数表称为m行n列的矩阵,简称m × n矩阵.记作: 矩阵的存在主要是由于它的运算,下面来简单看一下: 加法 [2637]+[1324]=[395

[转]二维图形的矩阵变换(一)——基本概念

来源:http://www.cnblogs.com/TianFang/p/3920734.html 基本的二维变换可包括旋转.缩放.扭曲,和平移四种,              而这些几何运算则可以转换为一些基本的矩阵运算: 这几个变换都是线性的,但平移运算不是线性的,不能通过2*2矩阵运算完成.若要将点 (2, 1)在 x 方向将其平移 3 个单位,在 y 方向将其平移 4 个单位. 可通过先使用矩阵乘法再使用矩阵加法来完成此操作. 综合这几种基本运算,数学家们将其统一为一个3*3矩阵,存储形

『理论』科学计算专项_线性代数几何原理剖析

矩阵左乘向量的两种理解 1,矩阵左乘向量可以理解为对向量进行线性变换 探究原理的话,可以理解左乘为对整个空间(基&目标向量)进行线性变换,其中, 变换矩阵是基'在基的坐标的列向量组合 目标向量是向量在基中的坐标 结果向量是向量'在基下的坐标 就结果来看,实质是利用向量在基下的坐标和基'在基下的坐标,求出整个空间旋转到基'位置后向量的新位置(向量')在原基下的坐标. 详细说明如下: 把基画出来的原因是因为矩阵变换的其实是基. 举例子来看看,比如旋转(旋转矩阵 ): 2.矩阵左乘向量可以理解为单纯的

深度图转点云的原理

深度图转点云的计算过程很简洁,而里面的原理实际是从内外参矩阵变换得到.下面来介绍其推导的过程. 1. 原理 首先,要了解下世界坐标到图像的映射过程,可以参考下教程"相机标定(2)---摄像机标定原理",这里不做赘述.用公式具体的表达如下: \(z_{c}\begin{bmatrix}u\\ v\\ 1\end{bmatrix}=\begin{bmatrix}f/dx & 0 & u_{0}\\ 0 & f/dy & v_{0}\\ 0 & 0 & 1 \en