19

我想做一些 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  }

不需要最后一行。

4

2 回答 2

33

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

就是我们想要方阵的原因。

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

然后旋转将是

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

和翻译将是

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

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

    ( x )
M   ( y )
    ( 0 )

以获得正确的答案。

但是- 我们将如何组合转换?确实,对于您的“对于旋转+平移,我有一个这样的矩阵”示例,您是如何到达该矩阵的?当然,在这种情况下你可以把它写出来,但一般来说呢?好吧,你知道答案:

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

所以必须有可能将两个变换矩阵相乘得到另一个变换矩阵。矩阵乘法的规则表明:

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

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


现在,我在这里表达它的方式实际上完全背离了标准数学表示,其中熟悉的旋转和平移变换只是投影平面上齐次坐标变换的全部威力的特例——但我认为它将向您展示为什么我们需要额外的行 - 使矩阵成为正方形,从而能够与类似的矩阵相乘。

于 2012-05-22T12:23:00.530 回答
6

答案是齐次坐标。要在一个操作中结合旋转和平移,需要比模型所需的额外维度。对于平面事物,这是 3 个组件,对于空间事物,这是 4 个组件。运算符采用 3 个组件并返回 3 个需要 3x3 矩阵的组件。

于 2012-05-22T11:59:30.757 回答