Matrix pre post set操作的含义

原创 2016年05月30日 15:19:39

部分是转载的

首先要完全理解矩阵操作需要学习高等数学中的课程线性代数

pre, post 是前乘, 后乘的意思


也就是说

原始矩阵B, 变换矩阵为A

pre操作: A*B

post操作: B*A

因为矩阵相乘不满足交换律

A*B != B*A

所以操作结果不一样

虽说以前学习过线性代数和图形学原理,但是在实际中碰到matrix还是疑惑了好一阵子,今天通过向同事请教终于找到一点门路,特总结如下:

Matrix主要用于对平面进行缩放,平移,旋转以及倾斜操作,为简化矩阵变换,Android封装了一系列方法来进行矩阵变换,其中包括pre系列方法:preScale,preTranslate,preRotate,preSkew,set系列方法:setScale,setTranslate,setRotate,setSkew,post系列方法:postScale,postTranslate,postRotate,postSkew。

通过将变换矩阵与原始矩阵相乘来达到变换的目的,例如:

平移:

旋转:

缩放:

有一点要说明:上图中的原始矩阵为3*1的矩阵,我们可以将其扩展成3*3的矩阵,否则下文涉及到的后乘操作将不成立,甚至在后乘的时候我们可以看成是1*3的矩阵,这不影响实际的变换效果。

之前一直不理解为什么要设置pre,set和post三种变换操作,我一直认为只通过post操作即可完成所有的变换,后来通过查阅相关资料以及同事的指点,有了一些粗浅的认识,当然现在的认识仍然是模模糊糊,甚至是错误的,希望通过博客和大家分享并纠正我可能存在的错误。

pre方法表示矩阵前乘,例如:变换矩阵为A,原始矩阵为B,pre方法的含义即是A*B

post方法表示矩阵后乘,例如:变换矩阵为A,原始矩阵为B,post方法的含义即是B*A

  1. matrix.preScale(0.5f, 1);   
  2. matrix.preTranslate(100);  
  3. matrix.postScale(0.7f, 1);    
  4. matrix.postTranslate(150);  

等价于:

translate(10, 0) -> scale(0.5f, 1) -> scale(0.7f, 1) -> translate(15, 0)

注意:后调用的pre操作先执行,而后调用的post操作则后执行。

set方法一旦调用即会清空之前matrix中的所有变换,例如:

  1. matrix.preScale(0.5f, 1);   
  2. matrix.setScale(10.6f);   
  3. matrix.postScale(0.7f, 1);   
  4. matrix.preTranslate(150);  

等价于

translate(15, 0) -> scale(1, 0.6f) ->  scale(0.7f, 1)

matrix.preScale (0.5f, 1)将不起作用。

以下为个人理解,不保证一定正确:

如果通过getMatrix()得到的matrix是一个未经过任何变换的单元矩阵,或者是之前已经调用过setMatrix的matrix,那么我们可以仅使用post系列方法或者pre系列方法的其中一种来完成各种变换操作,因为此时我们仅使用pre或者post方法来定义各种变换次序。

但是如果我们得到的matrix是一个非单元矩阵,并且该matrix还未调用setMatrix应用到实际中,此时我们可能同时需要pre和post方法来实现我们所需要的变换,例如C是通过getMatrix得到的并满足之前描述的matrix,此时如果我想在现有的变换之前进行某些变换,此时只有pre方法可以做到,假如C是一个执行过postScale操作的matrix,此时我想在postScale之前进行平移,那只有调用preTranslate,这样当调用setMatrix的时候会先进行preTranslate操作,再进行postScale操作。必须这么做的前提就是先scale后translate和先translate后scale得到的是不同的变换效果。

个人觉得以上分析结果很可能存在一些偏差,如哪位大侠发现错误还请麻烦指正~~


setScale,preScale和postScale的区别

下面是Matrix3*3的矩阵结构 [java] view plaincopy 1.    {MSCALE_X,MSKEW_X,MTRANS_X,   2.    MSKEW_Y,MSCALE_...
  • u010838555
  • u010838555
  • 2015年03月16日 16:05
  • 4039

Android 图形处理特效 Matrix 的set 、 pre、post方法的区别和使用

Android 图形处理特效 Matrix 的set 、 pre、post方法的区别和使用 Matrix包含一个3 X 3的矩阵,专门用于图像变换匹配。 Matrix提供了四种操作: transl...
  • legend12300
  • legend12300
  • 2016年07月09日 20:52
  • 1868

android Matrix的pre、post、set三种变形方式

在Matrix中,pre、post、set都有队应的Rotate、Scale、Translate、Skew函数,每个函数的效果都可以看成是一个3x3矩阵与matrix的乘积。对于同样的函数f()的pr...
  • gu_solo
  • gu_solo
  • 2016年03月18日 09:59
  • 1347

Matrix的preXxx,setXxx,postXxx方法执行顺序的区分

Matrix的preXxx,setXxx,postXxx方法执行顺序的区分 大家在android开发时,免不了用到Matrix这个类,其实就是一个操作矩阵的类。 其中包括pre系列方法:pr...
  • fyduan
  • fyduan
  • 2016年01月07日 20:55
  • 993

Android中的Matrix,以及set,pre和post的区别

①sin(α+β)=sinαcosβ+cosαsinβ ②cos(α+β)=cosαcosβ-sinαsinβ 公式①可以由单位圆方法或托勒密定理推导出来。 参见:http://blog.sina.c...
  • gaojinshan
  • gaojinshan
  • 2013年12月15日 15:15
  • 8408

Android中关于矩阵(Matrix)前乘后乘的一些认识

在上一篇文章中,我们讲到,在Android中,scale(缩放),rotation(旋转)和 translation(平移)都是以矩阵(Matrix)的形式定义的,实际上在图形学中,这些平面图形的变换...
  • foolsheep
  • foolsheep
  • 2014年01月28日 00:15
  • 10074

Android Matrix对图像简单介绍

本篇文章是对Android Matrix API的简单介绍,需要的朋友参考下 Matrix的对图像的处理可分为四类基本变换: Translate 平移变换 Rotate ...
  • http832
  • http832
  • 2016年05月18日 16:51
  • 379

Android学习记录(9)—Android之Matrix的用法

Matrix ,中文里叫矩阵,高等数学里有介绍,在图像处理方面,主要是用于平面的缩放、平移、旋转等操作。 首先介绍一下矩阵运算。加法和减法就不用说了,对应位相加就好。图像处理,主要用到的是乘法 。下面...
  • loongggdroid
  • loongggdroid
  • 2014年01月23日 15:58
  • 16822

用DFS计算pre和post

Description 给出一个有向图,从1号顶点出发,求该图每个顶点的pre值和post值。为了使本题的答案唯一,规定:当一个顶点发出多条弧的时候,按顶点的编号,从小到大进行遍历。温馨提示:时...
  • qq_23581569
  • qq_23581569
  • 2015年12月06日 20:02
  • 681

简单的学习Matrix的缩放,平移,旋转,倾斜

/* * translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)四种*/ public class MyView extends View{ private ...
  • u011057161
  • u011057161
  • 2014年06月07日 17:19
  • 1761
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Matrix pre post set操作的含义
举报原因:
原因补充:

(最多只允许输入30个字)