`
wiseideal
  • 浏览: 443850 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

[转]Android中Matrix的pre post set方法理解

 
阅读更多

虽说以前学习过线性代数和图形学原理,但是在实际中碰到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得到的是不同的变换效果。

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

分享到:
评论

相关推荐

    详谈Android中Matrix的set、pre、post的区别

    下面小编就为大家带来一篇详谈Android中Matrix的set、pre、post的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Android开发Matrix操作图片

    在Android中,为我们提供一些封装好的方法可以进行一些简单的图像操作,总共分为rotate(旋转),scale(缩放),translate(平移)和skew(倾斜)四种,每一种变换都提供了set, post和pre三种操作方式,除了translate,其他...

    Matrix的set,pre,post调用顺序详解

    Matrix调用一系列set,pre,post方法时,可视为将这些方法插入到一个队列。当然,按照队列中从头至尾的顺序调用执行。 其中pre表示在队头插入一个方法,post表示在队尾插入一个方法。而set表示把当前队列清空,并且...

    matrix矩阵变换

    android matrix 矩阵变换 set pre post 区别

    Android中使用Matrix控制图形变换和制作倒影效果的方法

    Matrix的每种操作都有set、pre、post三种操作,set是清空队列再添加,pre是在队列最前面插入,post是在队列最后面插入。 pre方法表示矩阵前乘,例如:变换矩阵为A,原始矩阵为B,pre方法的含义即是A*B po

    Android 矩阵ColorMatrix

    中文名:坐标矩阵 高等数学里有介绍,在图像处理方面,主要是用于平面的缩放、平移、旋转等操作。...Matrix调用一系列set,pre,post方法时,可视为将这些方法插入到一个队列.当然,按照队列中从头至尾的顺序调用执行.

    Tips_and_Tricks_with_DirectX_9.pdf

    Specular Bump Mapping on Pre-ps_1_4 Hardware 149 Matthew Halpin Voxel Rendering with PS_3_0 161 Aaron Burton Simulating Blending Operations on Floating-point Render Targets 172 Francesco Carucci ...

    ZJU_ACM_All_Anwer 搞编程的都知道的浙江大学A 题库.本书 集了所有经 Z 题解集,集合并附 Mathimaticsumerical algorithms 数值算法

    1094 Matrix Chain Multiplication 简单题 1536 Labyrinth 简单题 1100 Mondriaan s Dream 简单题,DP可以过,不过据说有复杂的组合公式 1103 Hike on a Graph 简单题 1134 Strategic Game 简单题 1147 ...

    浙江大学ACM题解/ZJU 题型分类

    1094 Matrix Chain Multiplication 简单题 1536 Labyrinth 简单题 1100 Mondriaan s Dream 简单题,DP可以过,不过据说有复杂的组合公式 1103 Hike on a Graph 简单题 1134 Strategic Game 简单题 1147 ...

    Text Mining: Classification, Clustering, and Applications

    5 Nonnegative Matrix and Tensor Factorization for Discussion Tracking 95 Brett W. Bader, Michael W. Berry, and Amy N. Langville 5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . ....

    eac3to V3.17

    * video without framerate information: framerate can be set (e.g. "-23.976") * video without framerate information: new framerate is written to bitstream * remaining non-fixed audio delay is now shown...

    Service Support-英文原版

    Preface.........................................................................................................................................- 1 - 1 Introduction.......................................

Global site tag (gtag.js) - Google Analytics