1.Matrix基础简介(MPAndroidChart源码解析)

884 阅读3分钟

1.简介

Matrix是谷歌提供的可以方便操作3*3放射矩阵的类,矩阵如下图所示:

仿射矩阵.png
可以清晰的看到矩阵的各个位置上的元素的作用,最常用的就是1和5的scale 和 3和6的translate,剩下的是2和4的错切,最后三个参数是控制透视的,这三个参数主要在3D效果中运用,通常为(0, 0, 1)。

2.Matrix常用方法

2.1赋值相关

1.void set (Matrix src) //将参数Matrix的数值复制到当前Matrix中
2.void reset ()    //重置当前Matrix(将当前Matrix重置为单位矩阵)
3.boolean invert (Matrix inverse)//求逆矩阵

2.2缩放,平移等操作

public void setTranslate(float dx, float dy)
public void setScale(float sx, float sy, float px, float py)//sx,sy代表了缩放的倍数,px,py代表缩放的中心
public void setScale(float sx, float sy)  
public void setRotate(float degrees, float px, float py)
public void setRotate(float degrees)
public void setSkew(float kx, float ky, float px, float py)//错切
public void setSkew(float kx, float ky)

2.3数值计算相关

1.void mapPoints (float[] pts) //方法仅有一个参数,pts数组作为参数传递原始数值,计算结果仍存放在pts中。
2.void mapPoints (float[] dst, float[] src)//src作为参数传递原始数值,计算结果存放在dst中,src不变。
3.boolean mapRect (RectF rect) //测量rect并将测量结果放入rect中,返回值是判断矩形经过变换后是否仍为矩形。
4.boolean mapRect (RectF dst, RectF src) //测量src并将测量结果放入dst中 
  //  简单使用
//需求1:有原始的数组[1.f,2.f,3.f],在canvas放大3倍,然后沿x轴正方向移动100px,获取该数组映射到canvas上的数值
float[] src = [1f,2f,3f];
//1.创建一个单位矩阵
Matrix matrix = new Matrix();
//2.放大3倍,平移100px
matrix.setScale(3.f,3.f);
matrix.setTanslate(100,0);
//获得[1.f,2.f,3.f]映射到该矩阵的值
matrix.mapPoints(src);


//需求2:使用一下mapRect
mapRect就不写了,使用和上面差不多,在MPAndroidChart中主要就是柱形图会用到

2.4矩阵相乘

数学定律:

矩阵乘法不满足交换律,即 AB ≠ BA 矩阵乘法满足结合律,即 (AB)C = A(BC)

api中包含前乘(prexxx)和后乘(postxxx)两种,使用的时候我们不必去管前乘和后乘,比如我们全用pre或者post,只关注我们是要先缩放还是先平移。

 Matrix matrixPre = new Matrix();
        matrixPre.preScale(0.5f,0.5f);
        matrixPre.preTranslate(100,100);
        Log.e("matrixPreResult",matrixPre.toShortString());

        Matrix matrixPost = new Matrix();
        matrixPost.postScale(0.5f,0.5f);
        matrixPost.postTranslate(100,100);
        Log.e("matrixPostResult",matrixPost.toShortString());

这两者的结果是不一样的,打印结果如下 matrixPreResult: [0.5, 0.0, 50.0][0.0, 0.5, 50.0][0.0, 0.0, 1.0] matrixPostResult:[0.5, 0.0, 100.0][0.0, 0.5, 100.0][0.0, 0.0, 1.0] 全用一种乘法,在实际问题中可以根据需求调整顺序,第一种写法影响了平移的距离,第二种没有影响,原因如何写一下公式计算一下就知道了。 其实规律也很简单,因为矩阵中各个位置上的元素代表的含义都是固定的,比如我们我们计算tranX的时候,必然是第一行乘以第三列,如果我们的tanMatrix的第一行是[1,0,100],scaleMatrix第三列中没有位移是[0,0,1],scale因素就不会起作用,如下所示:

[1,0   ,100]          [0.5,0   ,0]        [0.5, 0.0, 100.0]
[0,1   ,100]     *    [0,0.5   ,0]  =     [0.0, 0.5, 100.0]
[0  ,0   ,1]          [0  ,0   ,1]        [0.0, 0.0, 1.0]

2.5打印矩阵

1.toString() //将Matrix转换为字符串: Matrix{[1.0, 0.0, 0.0][0.0, 1.0, 0.0][0.0, 0.0, 1.0]}
2.toShortString() //[1.0, 0.0, 0.0][0.0, 1.0, 0.0][0.0, 0.0, 1.0]