Matrix学习1、基础的知识

Matrix学习1、基础的知识

android.graphics包下面的Matrix(矩阵)类,是Android提供的一个工具类,专门用来进行图像的处理。关于矩阵的基本知识和加减乘除运算这里不再赘述,需要了解的可以看看线性代数有关知识(http://course.tjau.edu.cn/xianxingdaishu/jiao/2.htm)。

下面是Matrix的介绍:

/**

 * The Matrix class holds a 3x3 matrix for transforming coordinates. Matrix does

 * not have a constructor, so it must be explicitly initialized using either

 * reset() - to construct an identity matrix, or one of the set..() functions

 * (e.g. setTranslate, setRotate, etc.).

 *  Matrix类通过一个3*3的矩阵来改变坐标。Matrix并没有矩阵的构造器,因此它必须显示的初始化,使用reset()来构造一个对角的

 *  矩阵,或者使用set***()(下面几个函数setTranslatesetRotate等等)

 */

查看Matrix源码,最开始deep部分有9个静态的常量

public static final int MSCALE_X = 0; // !< use with getValues/setValues

public static final int MSKEW_X = 1; // !< use with getValues/setValues

public static final int MTRANS_X = 2; // !< use with getValues/setValues

public static final int MSKEW_Y = 3; // !< use with getValues/setValues

public static final int MSCALE_Y = 4; // !< use with getValues/setValues

public static final int MTRANS_Y = 5; // !< use with getValues/setValues

public static final int MPERSP_0 = 6; // !< use with getValues/setValues

public static final int MPERSP_1 = 7; // !< use with getValues/setValues

public static final int MPERSP_2 = 8; // !< use with getValues/setValues

可以看到,这是一个0-89个静态常量,实际上,每个常量就代表他在一个长度为9的一维数组中的位置。更准确的理解,应该说是它们在一个3*3的矩阵中的位置,这也是为什么这个类叫做Matrix的原因。 

 

其中 MSCALE_XMSCALE_Y分别是控制X轴和Y轴方向的缩放,MSKEW_XMSKEW_Y是分别控制X坐标和Y坐标的扭曲系数,MTRANS_XMTRANS_Y则是控制X方向和Y方向的线性平移。MPERSP_0MPERSP_1MPERSP_2是关于透视的控制。

 

所以,对于Matrix的操作,其实都是对这9个值的操作。下面看MAtrix的公共方法

 

public Matrix()//构造方法,初始化一个对角矩阵

 

public Matrix(Matrix src)//构造方法

 

 

public boolean equals(Object obj)//判断一个对象是不是Matrix,并且和它是不是有相当的值,也就是对9个值的比较

 

 

public void getValues(float[] values) //matrix9个值复制到这个数组中

 

public void setValues(float[] values)//将数组中的值复制到matrix中。

 

public boolean invert(Matrix inverse)//

 

public boolean isIdentity()//判断这个matrix是不是对角矩阵的

 

public void mapPoints(float[] pts)//应用这个matrix对这个数组中代表的2D点进行变换,变换的结果的点的信息依旧写入到这个数组中

 

public void mapPoints(float[] dst, float[] src)//应用这个matrix对这个数组src中代表的2D点进行变换,变换的结果的点的信息写入到dst数组中

 

public void mapPoints(float[] dst, int dstIndex, float[] src, int srcIndex, int pointCount)//应用这个matrix对这个数组src中代表的2D点进行变换,变换的结果的

点的信息写入到dst数组中

 

public float mapRadius(float radius)

 

public boolean mapRect(RectF rect)//将这个matrix应用与一个矩阵,矩阵的信息依旧写入到它自己中。通过设置矩阵的4个顶点来完成设置

 

public boolean mapRect(RectF dst, RectF src)//将这个matrix应用与一个矩阵src,矩阵的信息依旧写入dts矩阵中。通过设置矩阵的4个顶点来完成设置

 

public void mapVectors(float[] vecs)//将这个matrix应用与一个代表2D向量的数组,得到的向量依旧写入到这个数组中

 

public void mapVectors(float[] dst, float[] src)//将这个matrix应用与一个代表2D向量的数组src,得到的向量写入到这个数组dst

 

public void mapVectors(float[] dst, int dstIndex, float[] src, int srcIndex, int vectorCount)//将这个matrix应用与一个代表2D向量的数组src,得到的向量写入到

这个数组dst

 

public boolean preConcat(Matrix other)//matrix与指定的另一个matrix组合,M'=other*M

 

public boolean postRotate(float degrees) //matrix与指定的另一个rotation(旋转角度)组合,M' = R(degrees) * M

 

public boolean postRotate(float degrees, float px, float py)//matrix与指定的另一个rotation(旋转角度)组合,M' = R(degrees, px,py) * M

 

public boolean postScale(float sx, float sy)//matrix与指定的另一个scale(缩放比)组合,M' = S(sx, sy) * M

 

public boolean postScale(float sx, float sy, float px, float py)//matrix与指定的另一个scale(缩放比)组合,M' = S(sx, sy, px, py) *M

 

public boolean postSkew(float kx, float ky)//matrix与指定的另一个skew(扭曲)组合,M' = K(kx, ky) * M

 

public boolean postSkew(float kx, float ky, float px, float py)//matrix与指定的另一个skew(扭曲)组合,M' = K(kx, ky, px, py) *M

 

public boolean postTranslate(float dx, float dy) //matrix与指定的另一个translation(位移)组合,M' = T(dx, dy) * M

 

public boolean preSkew(float kx, float ky)//matrix与指定的另一个skew(扭曲)组合M' = M * K(kx, ky)

 

public boolean preSkew(float kx, float ky, float px, float py)//matrix与指定的另一个skew(扭曲)组合,M' = M * K(kx, ky, px, py)

 

public boolean preRotate(float degrees)//matrix与指定的另一个rotation(旋转角度)组合,M' = M * R(degrees)

 

public boolean preRotate(float degrees, float px, float py)//matrix与指定的另一个rotation(旋转角度)组合,M' = M * R(degrees,px, py)

 

public boolean preScale(float sx, float sy)//matrix与指定的另一个scale(缩放比)组合,M' = M * S(sx, sy)

 

public boolean preScale(float sx, float sy, float py)//matrix与指定的另一个scale(缩放比)组合,M' = M * S(sx, sy, px,

 

public boolean preTranslate(float dx, float dy)//matrix与指定的另一个translation(位移)组合,M' = M * T(dx, dy)

 

public void set(Matrix src)//将矩阵src复制到当前matrix,如果src代表的矩阵是null,那么就将当前的matrix设置为对角矩阵

 

public void reset()//重新将一个矩阵设置为对角矩阵

 

public void setTranslate(float dx, float dy)//设置一个matrixtranslation(位移)

 

public void setScale(float sx, float sy, float px, float py)//设置matrixscale(缩放比 sx,sy),以点(px,py)为中心

 

public void setScale(float sx, float sy)//设置matrixscale(缩放比 sx,sy

 

public void setRotate(float degrees) //设置matrixrotation(旋转度)

 

public void setRotate(float degrees, float px, float py)//设置matrixrotation(旋转度),以点(px,py)为中心

 

public void setSinCos(float sinValue, float cosValue)//以指定的正弦和余弦设置matrixrotation(旋转度)

 

public void setSinCos(float sinValue, float cosValue, float px, float py) //以指定的正弦和余弦设置matrixrotation(旋转度),以点(px,py)为中心

 

public void setSkew(float kx, float ky)//设置matrix的扭曲度

 

public void setSkew(float kx, float ky, float px, float py)//设置matrix的扭曲度,以点(px,py)为中心

 

public boolean setConcat(Matrix a, Matrix b)//设置两个matrix的组合,this=a*b

 

public boolean rectStaysRect()

 

public boolean setPolyToPoly(float[] src, int srcIndex, float[] dst, int dstIndex,int pointCount)//设置一个matrix,可以使数组src中的点转换到dst中的点

 

public boolean setRectToRect(RectF src, RectF dst, ScaleToFit stf) //设置一个matrix,可以使矩阵src转换成dst

可以看到,Android封装好的方法中,一切的操作都是变向的设置3*3矩阵中的9个值,然后,我们间接的利用这些值来进行变换。

原文地址:https://www.cnblogs.com/li-print/p/3318805.html