为什么2D转换需要的3x3矩阵?(Why do 2D transformations need 3x

2019-06-24 16:33发布

我想要做一些2D绘图,从而希望实现一些矩阵变换。 用我的光明数学背景,我想了解如何在C#(任何其他OOP语言会做到这一点显然)这样做。

我所读的解释,我们需要用3×3矩阵来工作,以便能够应付翻译。 因为你不能用乘法翻译。 但是,这是与我们创建变换矩阵的乘法。 因此,我们有类似的工作:

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

据我所知,第三列的平均值,但为什么我们需要第三排? 在一个单位矩阵,以及在一个旋转,缩放和旋转的最后一行是一样的。 是否有操作我没有达到尚未将需要它吗? 是不是因为某些语言(Java)执行与“平方尺寸”阵列更好? 如果是的话,我可以使用3列和2列在C#中(因为锯齿状排列的作品,以及或更好)。

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

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

没有必要在最后一排的。

Answer 1:

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

就是为什么我们要方阵。

假设我们做了你提出的东西,并用2×3矩阵中为我们的转换。

然后旋转会

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

和翻译会

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

我们可以通过由代表点的列向量我们的矩阵相乘,执行要么旋转或平移:

    ( x )
M   ( y )
    ( 0 )

得到正确的答案。

但是 -我们怎么会去创作什么变化吗? 事实上,为您“为旋转+平移我有这样一个矩阵”的例子,你是怎么到矩阵? 当然,在这种情况下,你可以只写出来,但在一般情况? 那么,你知道答案:

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

因此,它必须能够乘两个变换矩阵给另一变换矩阵 。 和矩阵乘法的规则表明这一点:

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

是不是一个有效的矩阵multiplcation。 我们需要一个能够按顺序multipled我们转换为组合的矩阵。 因此,我们有一个额外的行。


现在,我已经在这里表达的方式,其实是从标准的数学演示,其中旋转和平移熟悉的转换只是在射影平面齐次坐标变换的全功率的特殊情况下完全落后 - 但我认为它会做给你看,为什么我们需要一个额外的行 - 使矩阵平方,从而能够与像矩阵来multipled。



Answer 2:

答案是齐次坐标。 要在一个操作中结合旋转和平移需要一个额外的维度比模型需要。 对于平面的事情,这是3层的组件和用于空间的事情,这是4种成分。 运营商需要3个部件,并返回3个部件需要3×3矩阵。



文章来源: Why do 2D transformations need 3x3 matrices?