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

不需要最后一行。

有帮助吗?

解决方案

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

这个是我们想要平方矩阵的原因。

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

然后旋转将是

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

和翻译是

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

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

    ( x )
M   ( y )
    ( 0 )
.

得到正确的答案。

然而 - 我们如何达到编写转换?事实上,对于你的“旋转+翻译,我有一个像这样的矩阵”示例,你是如何进入的矩阵?当然,在这种情况下,你可以写完,但一般?好吧,你知道答案:

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

因此,必须可以将两个变换矩阵乘以另外两个变换矩阵。矩阵乘法规则显示:

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

不是有效的矩阵乘法。我们需要可以乘以矩阵,以便将转换为可编译。所以我们有额外的行。


现在,我在这里表达的方式实际上是从标准的数学演示中完全落后,其中旋转和翻译的熟悉的变换只是投影平面上同质坐标变换的全功率的特殊情况 - 但我认为它会向您展示为什么我们需要额外的行 - 制作矩阵广场,从而能够像矩阵一样乘以。

其他提示

答案是均匀的坐标。为了在一个操作中结合旋转和翻译,需要比模型所需的一个额外的维度。对于平面的东西,这是3个组件和空间事物,这是4个组件。操作员使用3个组件并返回需要3x3矩阵的3个组件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top