Matrix.postScale(int,int)方法的结果

时间:2012-07-02 12:11:11

标签: android matrix

我对postScale方法究竟如何计算矩阵值感到困惑。 这是代码:

Matrix m1 = new Matrix();
float[] values = { 1f, 2f, 3f, 4f, 5f, 6f, 7f, 8f, 9f };
m1.setValues(values);
Matrix m2 = new Matrix(m1);

m1.preScale(2f, 3f); //result: 2, 6, 3, 8, 15, 6, 14, 24, 9
m2.postScale(2f, 3f); //result: 1, 2, 3, 6, 7.5, 9, 3.5, 4, 4.5

文档说preScale的结果是(Matrix * scale),postScale的结果是(scale * Matrix)。但如果我手动计算矩阵,结果会有所不同。

从右边乘:

1 2 3 | 2 0 0   2   6 3
4 5 6 | 0 3 0 = 8  15 6
7 8 9 | 0 0 1   14 24 9

从左边乘:

2 0 0 | 1 2 3    2  4  6
0 3 0 | 4 5 6 = 12 15 18
0 0 1 | 7 8 9    7  8  9

... 左侧乘法(postScale)返回的结果与我预期的不同

我甚至研究过本机实现(Matrix_Delegate.java)。但我不知道问题出在哪里。有什么我想念的吗?

1 个答案:

答案 0 :(得分:2)

在setConcat(在android / external / skia / src / core / SkMatrix.cpp中)将两个矩阵相乘后,其中至少有一个是透视矩阵,它调用一个名为“normalize_perspective”的方法。如果矩阵的最后一个单元格(右下角,mat [2] [2]如果零索引,此表示中的mat [8])大于1,则它将矩阵中的每个数字除以2。这当然描述了我们在这里看到的内容。

但我们的友好矩阵如何被视为透视矩阵?好。当我们执行setValues()时,类型被设置为Unknown。当setConcat调用getType时,它会看到“unknown”并决定对此做些什么。它调用computeTypeMask。 computeTypeMask查看第三列,看到它不是[0 0 1],并在矩阵的类型上拍一个Perspective标签。这发生在你的m2。

但为什么这只是postScale的问题? preScale(除非Skia库是以定点模式编译的)进行缩放本身,所以它永远不会进入setConcat来攻击这些岩石浅滩。

为什么normalize_perspective是个好主意?如果我知道,该死的。这可能与这些特定例程的预期2d图形应用程序有关。

你能做些什么呢?如果你的目标是API等级11或更高,那么renderscript的Matrix3f可能就是你的朋友。如果没有,我很抱歉,D-Fox,你的矩阵实现在另一座城堡里。