为什么2D变换需要3x3矩阵?

时间:2012-05-22 09:08:03

标签: matrix 2d homogenous-transformation

我想做一些2D绘图,因此想要实现一些矩阵变换。凭借我轻松的数学背景,我试图了解如何在C#中实现这一点(任何其他oop语言都会这样做)。

我读到的只是解释我们需要使用3x3矩阵才能应对翻译。因为你不能用乘法进行翻译。但这是我们创建转换的矩阵的乘法。所以我们使用类似的东西:

{ x1, x2, tx }
{ y1, y2, ty }
{ 0,  0,  1  }

我理解第三列的意思,但为什么我们需要第三列呢?在单位矩阵以及旋转,缩放或旋转中,最后一行是相同的。我还没有达到需要的操作吗? 是因为某些语言(Java)使用“平方维度”数组表现更好吗?如果是这样的话,我可以在C#中使用3列和2行(因为锯齿状数组也能正常工作或更好)。

例如,对于旋转+平移,我有一个像这样的矩阵

{ cos(rot)*x1, (-sin(rot))*x2, tx }
{ sin(rot)*y1, cos(rot)*y2,    ty }
{ 0,           0,              1  }

无需最后一行。

2 个答案:

答案 0 :(得分:27)

  

这是我们创建转换的矩阵的乘法

是我们想要方形矩阵的原因。

假设我们做了你的建议,并使用2x3矩阵进行转换。

然后轮换

( x1, x2, 0 )
( y1, y2, 0 )

并且翻译将是

( 1, 0, tx )
( 0, 1, ty )

我们可以通过将矩阵乘以表示点的列向量来执行旋转或平移:

    ( x )
M   ( y )
    ( 0 )

获得正确的答案。

然而 - 我们将如何进行撰写转换?事实上,对于你的“旋转+翻译,我有一个像这样的矩阵”的例子,你是如何到达那个矩阵的?当然,在这种情况下你可以写出来,但一般情况下?嗯,你知道答案:

  

这是我们创建转换的矩阵的乘法

因此必须能够将两个转换矩阵相乘以得到另一个转换矩阵。矩阵乘法的规则表明:

( . . . ) ( . . . )
( . . . ) ( . . . ) = ???

不是有效的矩阵乘法。我们需要可以乘法的矩阵,以便我们的变换可以组合。所以我们有额外的行。


现在,我在这里表达的方式实际上完全落后于标准的数学表达式,其中熟悉的旋转和平移变换只是投影平面上齐次坐标变换的全部力量的特殊情况 - 但是我想它会告诉你为什么我们需要那个额外的行 - 使矩阵成为正方形,从而能够与矩阵一样多倍。

答案 1 :(得分:5)

答案是同质坐标。要在一个操作中组合旋转和平移,需要一个额外的维度,而不是模型所需的维度。对于平面物体,这是3个组件,对于空间物体,这是4个组件。操作员需要3个组件并返回需要3x3矩阵的3个组件。