在GDI+中用Mattix类对2D矢量图形进行平移、缩放操作
1. GDI+中点坐标的格式及矩阵乘法的定义
GDI+中的的点按照1行3列的格式,即(x坐标,y坐标,1),其中1为哑元坐标。变换矩阵为3行3列格式,根据矩阵的乘法,变换后的坐标仍为1行3列的格式。
根据矩阵乘法的定义,A*B与B*A不一定相等,所以在对图形的坐标系实行多种变换时,图形变换的先后顺序将直接影响变换的结果。
在GDI+中,不同变换矩阵的顺序通过MatrixOrder来来调整,默认采用Matrix. Prepend矩阵放置方式,另一种放置方式为Matrix. Append,当矩阵的乘法运算时提供了选项。例如,坐标点P,平移变换矩阵T,比例变换矩阵S,采用P*T*S的顺序时,在GDI中分为两步走:
第一步,T变换:由于是坐标点乘以变换矩阵,不需要对乘法顺序进行选取。
dc.TranslateTransform(150, 150); //平移变换
第二步,S变换:由于T*S,此时需要说明乘法顺序
dc.ScaleTransform(1.75f, 0.5f, MatrixOrder.Append); //比例变换,后置
dc.ScaleTransform(1.75f, 0.5f); //比例变换,默认前置
//dc.ScaleTransform(1.75f, 0.5f, MatrixOrder.Prepend);
//dc.ScaleTransform(1.75f, 0.5f, MatrixOrder.Prepend);
2. 测试实例
定义一个矩形
Rectangle rect = new Rectangle(0, 0, 150, 150);
不同的变换顺序得到不同的结果。图1和图2 分别显示了先平移变换后比例变换的结果和先比例变换后平移变换的结果,其中红色表示变换前的图形,蓝色表示中间变换的结果,黑色表示最终的结果。
图1 先平移后缩放
图2 先缩放后平移
作者采用Mathcad软件验证了上面的结果,如图3所示。
图3 角点坐标计算