Matrix 为什么二维变换需要3x3矩阵?

Matrix 为什么二维变换需要3x3矩阵?,matrix,2d,homogenous-transformation,Matrix,2d,Homogenous Transformation,我想做一些二维绘图,因此想实现一些矩阵变换。以我浅薄的数学背景,我试图理解如何在C#中做到这一点(显然,任何其他oop语言都可以做到) 我所读到的只是解释我们需要使用3x3矩阵才能处理翻译。因为你不能用乘法进行翻译。但这是我们创建转换的矩阵乘法。因此,我们的工作是: { x1, x2, tx } { y1, y2, ty } { 0, 0, 1 } 我理解第三列的意思,但是为什么我们需要第三行呢?在单位矩阵以及旋转、缩放或旋转中,最后一行是相同的。是否有我尚未接触到的需要它的操作? 是因

我想做一些二维绘图,因此想实现一些矩阵变换。以我浅薄的数学背景,我试图理解如何在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  }

不需要最后一行。

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

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

这就是为什么我们需要平方矩阵

假设我们按照你的建议,使用2x3矩阵进行转换

那就轮换了

( x1, x2, 0 )
( y1, y2, 0 )
( 1, 0, tx )
( 0, 1, ty )
翻译也很好

( x1, x2, 0 )
( y1, y2, 0 )
( 1, 0, tx )
( 0, 1, ty )
我们可以通过将矩阵乘以表示点的列向量来执行旋转或平移:

    ( x )
M   ( y )
    ( 0 )
为了得到正确的答案

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

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

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

( . . . ) ( . . . )
( . . . ) ( . . . ) = ???
不是有效的矩阵乘法。我们需要可以被乘法的矩阵,以便我们的转换是可组合的。所以我们多了一排



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

从,然后按照@HighPerformanceMark的其中一个链接进行操作,我在这里试图解释我不理解这些概念中的哪一点。是的,这是我开始阅读的前两个文档。但是2D中{0,0,1}行的用途是什么?我们可以计算平移,也可以不用它计算线性变换。(如果我理解正确的话)正如我所说的,第三行需要产生一个由三部分组成的结果。在其他仿射变换中,可能第三个分量并不总是等于
1
,第三行也不是
[0 0 1]
;这是我没有预见到的“数学约束”。(抱歉说得太慢了)啊,这是我还没看到的重点!谢谢你,阿卡什。感谢您花时间找出了我思想中的漏洞。而翻译
(tx,ty)
的实际计算结果看起来像
[xy1]x[1000;010;txty1]=[x+txy+ty1]