本文主要是介绍Matrix学习3、Matrix的基本三种变换之Translation、Skew、Rotate,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Matrix的3*3矩阵:
- {MSCALE_X,MSKEW_X,MTRANS_X,
- MSKEW_Y,MSCALE_Y,MTRANS_Y,
- MPERSP_0,MPERSP_1,MPERSP_2}
一、平移(Translation)变换
Translation的变换是通过改变MTRANS_X和MTRANS_Y来实现的,Matrix提供了三个方法
preTranslate(float dx, float dy)
setTranslate(float dx, float dy)
postTranslate(float dx, float dy)
平移的变换特别简单,相信学过数学的人都知道,不说了。
二、扭曲(Skew)变换
skew变换是通过改变MSKEW_X,和MSKEW_Y来实现的,Matrix提供了下面的几个方法来设置skew
matrix.setSkew(kx, ky)
matrix.setSkew(kx, ky, px, py)
我能说其实关键就是,kx和ky传入的tan值吗?
经过自己测试,发现skew的变换是如下的规律:
点(x,y)经过skew(kx,ky,px,py)变换之后,坐标为(kx*(y-py)+px,ky*(x-px)+py),如果,px和py没有,则默认为都为0。
图片变换的效果
三、旋转(Rotate)的变换
- {MSCALE_X,MSKEW_X,MTRANS_X,
- MSKEW_Y,MSCALE_Y,MTRANS_Y,
- MPERSP_0,MPERSP_1,MPERSP_2}
matrix.setRotate(degrees)
matrix.setRotate(degrees, px, py)
matrix.preRotate(degrees)
matrix.preRotate(degrees, px, py)
matrix.postRotate(degrees)
matrix.postRotate(degrees, px, py)
这就不用解释了,degrees即我们要旋转的度数,px,py是我们旋转的角度通过这个设置,它会直接改变matrix矩阵里面的值,得到相应的变换矩阵。
还可以通过具体设置我们想要旋转的sin、cos角度来得到变换
matrix.setSinCos(sinValue, cosValue)
matrix.setSinCos(sinValue, cosValue, px, py)
Android中Matrix的set、pre、post的区别
说set、pre、post的区别之前,先说说Matrix。
Matrix包含一个3 X 3的矩阵,专门用于图像变换匹配。
Matrix提供了四种操作:
- translate(平移)
- rotate(旋转)
- scale(缩放)
- skew(倾斜)
也就是说这4种操作都是对这个3 X 3的矩阵设值来达到变换的效果。
Matrix没有结构体,它必须被初始化,通过reset或set方法。
OK,Matrix介绍完了,我们来看看set、pre、post的区别。
pre是在队列最前面插入,post是在队列最后面追加,而set先清空队列在添加(这也是上文提到的“Matrix没有结构体,它必须被初始化,通过reset或set方法”的原因)。
下面通过一些例子具体说明:
- matrix.preScale(2f,1f);
- matrix.preTranslate(5f, 0f);
- matrix.postScale(0.2f, 1f);
- matrix.postTranslate(0.5f, 0f);
- matrix.postTranslate(2f, 0f);
- matrix.preScale(0.2f, 1f);
- matrix.setScale(1f, 1f);
- matrix.postScale(5f, 1f);
- matrix.preTranslate(0.5f, 0f);
执行顺序:translate(0.5f, 0f) -> scale(1f, 1f) -> scale(5f, 1)
这篇关于Matrix学习3、Matrix的基本三种变换之Translation、Skew、Rotate的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!