Go homepage(回首页)
Upload pictures (上传图片)
Write articles (发文字帖)

The author:(作者)qq
published in(发表于) 2014/7/11 9:16:27
C#中GDI+变形的矩阵表示形式

C#中GDI+变形的矩阵表示形式

变形的矩阵表示形式

m×n矩阵是排列成m行和n列的一系列数,例如,图1为几个矩阵表示形式。

用户可以通过将单个元素相加来合并两个尺寸相同的矩阵,例如,图2表示两个矩阵相加。



图1 矩阵



图2 矩阵相加

m×n矩阵可与一个n×p矩阵相乘,结果为一个m×p矩阵,但如果两个矩阵相乘,第一个矩阵的列数必须与第二个矩阵的行数相同。例如,图3表示两个矩阵相乘。

如果将平面中的点视为1×2矩阵,则可通过将该点乘以一个2×2矩阵来将该点变换,例如,图23显示了应用于点(2, 1)的几个变换。

图4中显示的所有变换都是线性变换,如果变换(如平移)不是线性的,则不能表示为与2×2矩阵相乘的形式。例如,从点(2, 1)开始,将其旋转90°,然后在x方向将其平移3个单位,在y方向将其平移4个单位,这时可先使用矩阵乘法,再使用矩阵加法来完成此操作,如图5所示。

后面跟一平移的线性变换称为仿射变换。将仿射变换存储于一对矩阵(一个用于线性部分,一个用于平移)的替换方案是将整个变换存储于3×3矩阵。如果要使3×3矩阵起作用,平面上的点必须存储于具有虚拟第3坐标的1×3矩阵中。通常的方法是使所有的第3坐标等于1,例如,矩阵[2 1 1]表示点(2,1)。将图5中“点的平移”转换为仿射变换的结果如图6所示。



图3 矩阵相乘



图4 点的变换



图5 点的平移

在前面的示例中,点(2,1)映射到了点(2,6),请注意,3×3矩阵的第3列数字为:0、0、1,对于仿射变换的3×3矩阵而言,重要的数字是列1和列2中的6个数字,如图7所示,矩阵左上角的2×2部分表示变换的线性部分,第3行中的前两项表示变换的平移部分。



图6 仿射变换



图7 仿射变换分解图

在GDI+中,可以在Matrix对象中存储仿射变换。由于表示仿射变换的矩阵的第3列总是(0,0,1),因此在构造Matrix对象时,只需指定前两列中的6个数即可。

GDI+中,还有一种变换叫复合变换。复合变换是一个接一个的变换序列,它的矩阵表示形式可通过将几个单独的变换矩阵相乘而得到。Matrix类提供构建复合变换的方法包括Multiply、Rotate、RotateAt、Scale、Shear和Translate。

注意:

① 复合变换的顺序非常重要,一般说来,先旋转、再缩放、然后平移,与先缩放、再旋转、然后平移是不同的。同样,矩阵相乘的顺序也是非常重要的,一般说来,ABC 与 BAC 不同。

② Matrix类属于System.Drawing.Drawing2D命名空间。




If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)





QQ:154298438
QQ:417480759