关于矩阵的介绍这两片博文写的不错,特别引荐:
1. http://www.360doc.com/content/11/1215/11/7635_172396706.shtml
2. http://blog.csdn.net/flash129/article/details/8234599
本博文主要介绍矩阵左乘(前乘)和右乘(后乘)的区别。
首先回顾下矩阵的运算的几个基本性质
1. 乘法结合律: (AB)C=A(BC)
2 .乘法左分配律:(A+B)C=AC+BC
3. 乘法右分配律:C(A+B)=CA+CB
4. 对数乘的结合性k(AB)=(kA)B=A(kB)
但矩阵乘法一般不满足交换律。即:
AB != BA
我们知道android中的矩阵最终都是坐标进行变换的,但坐标是3 * 1的矩阵,而变换的矩阵是 3*3的。
我们设坐标为矩阵A,变换的矩阵为B,变换后的坐标矩阵为C,那么根据运算规则只能是
C = B * A,即变换矩阵左乘与坐标矩阵,也即是前乘。
好介绍完基本概念,接下来,看下面的例子:
加入图像需要先按中心旋转90度,再向左平移120个像素,然后再缩放2倍,设依次变换的矩阵是:R1,T1,S1,
原坐标为O1,变换后的坐标设为O2。那么用公式表示即是: O2 = S1 * (T1 * (R1 * O1)); 按照结合律该公式等价于:
O2 = S1 * T1 * R1 * O1;
最后用android代码表示下:
Matrix m = new Matrix();
m.preRotate(cx,cy, 90); ----- R1
m.preTranslate(120, 0); ----- T1
m.preScale(2, 2); ----- S1
O1.preConcat(m);
所以从这里也可以看出来,为啥叫左乘叫先乘了,按照变换规则,顺序应该是R1, T1, S1。并且我们知道矩阵不满足交换律
所以顺序很重要,T1,S1,只能是左乘于R1,字面上意思也就是R1要在T1之前乘,而T1要在S1之前乘。
如果所有都换成后乘(右乘)就变成了: O2 = R1 * T1 * S1 * O1。按照结合律性质,翻译成字面上意思就是:先进行缩放变换
后进行平移变换,最后进行旋转变换了。和原来要求变换方式,完全颠倒。
so 一个字总结:矩阵变换顺序很重要地,先乘和后乘区别大大的。