System.Drawing.Drawing2D中的Matrix.Multiply工作......不同?

时间:2014-07-13 10:36:38

标签: c# matrix graphics

Matrix matrix1 = new Matrix(1, 0, 0, 1, 0, 0);
matrix1.Multiply(new Matrix(1, 0, 0, 1, 100, 200));

matrix1.Elements.ToList().ForEach(f => Console.Write(f + " "));
Console.WriteLine();

matrix1.Multiply(new Matrix(2, 0, 0, 2, 0, 0));

matrix1.Elements.ToList().ForEach(f => Console.Write(f + " "));
Console.WriteLine();

Console.ReadKey();

仅为记录,由于矩阵的最后一列始终等于(0,0,1),Matrix2D中的矩阵存储为(m11 m12 m21 m22 offsetx offsety)

据我所知,矩阵乘法的工作原理如下:

[1   0   0]   [2 0 0]   [2   0   0]
[0   1   0] * [0 2 0] = [0   2   0]
[100 200 1]   [0 0 1]   [200 400 1]

那么有人可以解释所提出的程序的以下结果吗?

1 0 0 1 100 200
2 0 0 2 100 200

1 个答案:

答案 0 :(得分:2)

The documentation解释了默认的乘法顺序是 prepend 给定的矩阵。因此,你的最后一次乘法实际上是这样的:

[2 0 0]   [1   0   0]    [2   0   0]
[0 2 0] * [0   1   0]  = [0   2   0]
[0 0 1]   [100 200 1]    [100 200 1]

反过来说,打​​印的控制台结果是正确的。

为了达到预期的效果,您可以使用Matrix.Multiply Method (Matrix, MatrixOrder)重载并将MatrixOrder.Append作为第二个参数。