概览
matrix,中文名:矩阵,曾经在《线性代数》中出现过。我们应该学过矩阵乘法,知道它不满足乘法交换律,知道前乘和后乘结果不一样。
在android中也多次出现matrix,例如:
- ImageView的scaleType有一个matrix的值,设置缩放属性为matrix
- Canvas也可以设置matrix: Canvas.setMatrix,设置canvas的位移、缩放、旋转
- TextureView也可以设置matrix: TextureView.setTransform,设置画面的位移、缩放、旋转
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矩阵 ,它的一个元素:

例如:

矩阵和向量相乘:如果A是m×n矩阵和B是n×1矩阵(向量n),它们的乘积C是一个m×1矩阵(向量m)
对角矩阵(identity matrix):一个n*n的矩阵,非对角线上的元素均为0
对角矩阵和向量相乘:如果对角线元素均为1,那么结果还是向量本身

顶点 构成图形的关键点,例如矩形的顶点是四个角,三角形的顶点是3个角
用向量(x, y, z)表示顶点坐标(x, y, z)
坐标变换
缩放
缩放相对容易理解,直接乘顶点坐标即可

可以看到,S1负责缩放x,S2负责缩放y, S3负责缩放z
位移
缩放也容易理解,直接乘顶点坐标即可

可以看到,T1负责x,T2负责y,T3负责z
旋转
旋转的数学逻辑比较复杂,我们跳过数据逻辑,直接看答案
绕x轴旋转

绕y轴旋转

绕z轴旋转

绕(Rx, Ry, Rz)旋转

拼接操作
通过矩阵乘法,我们可以把多个变换矩阵合并到一个矩阵,例如:先移动,再缩放

然后乘以顶点坐标,符合先位移再缩放

总结
- matrix可以合并多个变换为1个,相当于可以存储变换,也减少最终变换的计算量
- pre: 应用在所有变换之前
- post: 应用在所有变换之后
- set: 重新设置变换
网友评论