zoukankan      html  css  js  c++  java
  • 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个值,然后,我们间接的利用这些值来进行变换。

  • 相关阅读:
    redis集群
    鉴权方案选择
    spring mvc 自定义handler不拦截静态资源
    servlet3
    压测工具 ab jmeter
    死锁产生的原因
    缓存方案:本地guavaCache, 远程redis?
    使用spring boot admin
    groovy使用小记
    python--面试题01
  • 原文地址:https://www.cnblogs.com/li-print/p/3318805.html
Copyright © 2011-2022 走看看