GcsSloop / AndroidNote

安卓学习笔记
http://www.gcssloop.com/#blog
9.17k stars 2.14k forks source link

关于矩阵前乘后乘的排序是不是有问题? #49

Closed graycreate closed 8 years ago

graycreate commented 8 years ago

1. 仅用pre:

Matrix m = new Matrix();
m.reset();
m.preTranslate(tx, ty); //使用pre,越靠后越先执行。
m.preScale(sx, sy);

我感觉应该是这样的: S * T * M 而不是 M * T * S 因为pre是前乘,即参数给出的矩阵乘以当前的矩阵

2. 仅用post:

Matrix m = new Matrix();
m.reset();
m.postScale(sx, sy);  //使用post,越靠前越先执行。
m.postTranslate(tx, ty);

应该是: M * S * T 而不是 T * S * M

GcsSloop commented 8 years ago

请参考官方文档: https://developer.android.com/reference/android/graphics/Matrix.html#preConcat(android.graphics.Matrix)

preConcat

boolean preConcat (Matrix other) Preconcats the matrix with the specified matrix. M' = M * other

graycreate commented 8 years ago

preRotate

boolean preRotate (float degrees, float px, float py) Preconcats the matrix with the specified rotation. M' = M * R(degrees, px, py)

pre相当于矩阵的右乘,而post相当于矩阵的左乘。

这里的左右是相对于上式中的R(degrees, px, py)而言的吧?

GcsSloop commented 8 years ago

右乘指 M * R (R在M右侧)

graycreate commented 8 years ago

明白了, 一直以为左右乘是相对于当前矩阵而言. 其实前后乘才是相对于当前矩阵而言. THX!