Go homepage(回首页) Upload pictures (上传图片) Write articles (发文字帖)
The author:(作者)qqpublished in(发表于) 2014/7/11 9:16:27 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命名空间。
赞