Join GitHub today
GitHub is home to over 50 million developers working together to host and review code, manage projects, and build software together.
Sign upGitHub is where the world builds software
Millions of developers and companies build, ship, and maintain their software on GitHub — the largest and most advanced development platform in the world.
关于矩阵前乘和后乘的问题 #42
关于矩阵前乘和后乘的问题 #42
Comments
这个在Matrix原理一文中有解释。Pre与Post的区别主要区别其实就是矩阵的乘法顺序不同,pre相当于矩阵的右乘,而post相当于矩阵的左乘。 以下观点存在歧义,故做删除标注: 在实际操作中,我们每一步操作都会得出准确的计算结果,但是为什么还会用存在先后的说法? 难道真的能够用pre和post影响计算顺序? 实则不然,下面我们用一个例子说明: Matrix matrix = new Matrix();
matrix.postScale(0.5f, 0.8f);
matrix.preTranslate(1000, 1000);
Log.e(TAG, "MatrixTest:3" + matrix.toShortString());
|
|
这一段的解释并不明白,有两个变换矩阵和初始矩阵相乘的话,必然会导致两个矩阵相互影响的,这不能说明为什么会先执行平移操作,然后执行缩放操作 |
|
矩阵计算,每一步都会计算出确定的结果,执行顺序就是按照你程序的顺序,只不过有的是左乘,有的是右乘,用矩阵乘法规则推算一下就明白了。 |
|
|
我计算了一下,确实最后的点的结果是 相当于先进行了平移操作在进行了缩放操作。。 |
大神,这段代码的矩阵的排序是 PostTranslateMatrix * PostScaleMatrix * InitialMatrix * PreTranslateMatrix 吗 |
|
理论上是这样的,但是要注意计算顺序,计算顺序依旧是按照代码书写顺序进行计算的。 |
|
什么意思,按我那样写来计算的值好像是正确的,按代码书写那样来计算,结果好像是 |
Matrix matrix = new Matrix();
matrix.postScale(0.5f, 0.5f);
Log.i("Matrix", matrix.toShortString());
matrix.preTranslate(-pivotX, -pivotY);
Log.i("Matrix", matrix.toShortString());
matrix.postTranslate(pivotX, pivotY);
Log.i("Matrix", matrix.toShortString());上面这段代码的含义是按照某个点(pivotX, pivotY)的位置进行缩放。
其中每一步都得到了确定的结果,最终的结果是上面这样的。 你可以按照 PostTranslateMatrix * PostScaleMatrix * InitialMatrix * PreTranslateMatrix 这样的顺序来理解,由于矩阵乘法满足结合律,按照这样顺序计算也没错,但是这并非实际计算顺序,仅此而已。 |
|
明白了,我sb了,原来前乘后乘是要一步步看的,谢谢大神!!! |
|
楼主,你们在讨论矩阵的结合律吗? |
|
差不多 ╮ ( ̄ 3 ̄) ╭ |
|
/** |
|
你好,我想请问下 canvas中的contact()方法是前乘(pre) 还是后乘(post) 操作, 又比如之前对matrix进行了一堆变换, 这时候如果我想基于当前的变换 再旋转30度, 那这时候改使用 preRotate 还是postRotate,因为矩阵不满足交换律,这里两种情况一定是不一样的 , 那这样 改怎么理解和使用 pre和post |
|
你好我是看过了这篇文章后才有的这两个疑问,文章看了但是还是没有搞明白,主要是两个内容 感谢您的时间。 |
|
|
3q, 刚刚测试 pre是受之前matrix变换的影响, post不受之前matrix变换的影响, 不知道这个结论对吗? |
Matrix m = new Matrix();
m.reset();
m.preTranslate(tx, ty); //使用pre,越靠后越先执行。
m.preScale(sx, sy);
这里为什么越靠后先执行啊,矩阵乘法我记得是从左往右进行乘法计算的呀(╯‵□′)╯︵┻━┻