【问题标题】:Why do 2D transformations need 3x3 matrices?为什么二维变换需要 3x3 矩阵?
【发布时间】:2012-05-22 09:08:02
【问题描述】:

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

不需要最后一行。

【问题讨论】:

标签: matrix 2d homogenous-transformation


【解决方案1】:

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

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

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

然后是轮换

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

翻译应该是

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

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

    ( x )
M   ( y )
    ( 0 )

获得正确答案。

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

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

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

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

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


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

【讨论】:

  • 呃,那是我还没看到的重点!谢谢你 AakashM。感谢您花时间发现我的想法。
  • (tx,ty) 的翻译的实际计算看起来像 [x y 1] x [1 0 0; 0 1 0; tx ty 1] = [x+tx y+ty 1]
【解决方案2】:

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

【讨论】:

  • 但是 2D 中的 {0,0,1} 行的目的是什么?没有它,我们可以计算平移和线性变换。 (如果我理解正确的话)
  • 正如我所说,需要第三行才能产生 3 个组件的结果。在其他仿射变换中,第三个分量可能并不总是等于1,并且第三行不是[ 0 0 1 ]
  • 我没有想到我们需要这个来进行矩阵运算;这是我没有预见到的“数学约束”。 (抱歉有点慢)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多