理解android中出现的matrix
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解android中出现的matrix相关的知识,希望对你有一定的参考价值。
参考技术Amatrix,中文名:矩阵,曾经在《线性代数》中出现过。我们应该学过矩阵乘法,知道它不满足乘法交换律,知道前乘和后乘结果不一样。
在android中也多次出现matrix,例如:
matrix的运算函数有
setRotate、setScale、setTranslate
preRotate、preScale、preTranslate
postRotate、postScale、postTranslate
android中为什么使用matrix?
matrix的pre、post、set方法有什么区别?
矩阵 :是一个按照长方阵列排列的复数或实数集合
矩阵相乘 :两个矩阵的乘法仅当第一个矩阵 A 的列数和另一个矩阵 B 的行数相等时才能定义。如 A 是 m × n 矩阵和 B 是 n × p 矩阵,它们的乘积 C 是一个 m × p 矩阵 ,它的一个元素:
对角矩阵(identity matrix) :一个n*n的矩阵,非对角线上的元素均为0
缩放相对容易理解,直接乘顶点坐标即可
可以看到,S1负责缩放x,S2负责缩放y, S3负责缩放z
缩放也容易理解,直接乘顶点坐标即可
可以看到,T1负责x,T2负责y,T3负责z
旋转的数学逻辑比较复杂,我们跳过数据逻辑,直接看答案
绕x轴旋转
绕y轴旋转
通过矩阵乘法,我们可以把多个变换矩阵合并到一个矩阵,例如:先移动,再缩放
然后乘以顶点坐标,符合先位移再缩放
Android Matrix 的理解与应用
图像处理中的矩阵能做什么
仿射变换
- 缩放 旋转 移动 翻转 错切对应Matrix类
颜色与色相修改
- 对比度 亮度 饱和度 滤镜 对应ColorMatrix类
Matrix内部实现
点坐标用矩阵表示为
多一个1是为了形成齐次坐标系,以便用矩阵乘法来实现图像的仿射变换
变换矩阵为3*3的矩阵
下面来看一段代码
上图第四行的平移变换实现如下
通过矩阵计算可验证其正确性
第三行的缩放变换实现如下
第四行的旋转变换实现如下
矩阵相乘实现图像的变换
如果图像围绕着某个点P(tx,ty)旋转,则先要
1. 平移——将坐标系原点平移到点P(tx,ty);
2. 旋转——以原点为中心旋转图像;
3. 平移——将坐标系原点平移到原来的位置;
如下图所示
代码实现如下(忽略第三行。。。)
其实Android已经封装了这样的操作,即 matrix.setRotate(30,tx,ty);
理解常用的三种API
setXXX
先调用reset, 重置矩阵,然后set,所以之前例子的setScale( 0.5f,0.5f )实际上是无效的preXXX
右乘矩阵postXXX
左乘矩阵
看个例子
对应的矩阵乘法如下
矩阵运算满足交换律 (AB)C=A(BC)
安卓执行矩阵变换时,变换的矩阵放在左边,所以应该从右到左的理解上图。所以上图的执行顺序是 translate -> rotate -> scale -> translate。这样,pre就可以理解为先行执行的操作,post为靠后执行的操作
结语
如果是简单的矩阵变换,调用安卓的封装好的API就行,但了解矩阵变换的原理,能让我们实现复杂的图像变换,遇到问题时,也能通过打印矩阵来调试
本文是自己理解矩阵的一些总结。参考和引用了如下文章,感谢各位作者
Android Matrix理论与应用详解
理解矩阵Matrix
深入理解 Android 中的 Matrix
仿射变换与齐次坐标
以上是关于理解android中出现的matrix的主要内容,如果未能解决你的问题,请参考以下文章