二维图形几何变换有平移,缩放,旋转,错切,反射等几种。
二维图形由点或直线段组成的,而直线段又由两个端点连接而成的,从而对二维图形的变换都全部转换成点的变换。
所以下面我们就点的变换原因来讨论。
在讨论下面的问题之前,我们得先学习一个 System.Drawing.Drawing2.Matrix类,该类是坐标变换的最常用的类,当然你可以自己进行矩阵运算。
1. 平移变换:
平移变换的变换矩阵为: Tm= ,对应的Matrix定义为 Matrix m = new Matrix(1,0,0,1,Mx,My);
其中Mx是水平方向移动的距离,My是垂直方向的距离,向左负向右正,向下负向上正。
2. 缩放变换
平移变换的变换矩阵为: Ts= ,对应的Matrix定义为 Matrix s = new Matrix(Sx,0,0,Sy,0,0);
其中Sx是水平方向上缩放的比例,Sy是竖直方向上缩放的比例,大小1是放大,小于1是缩小,不能小于0。
3. 旋转变换
旋转变换的变换矩阵为: Tr=,对应的Matrix定义为Matrix r = new Matrix(cos
,sin
,-sin
,cos
,0,0);
其中sin,cos均为三角函数,为以原点旋转的角度数。
现举例说明如何处理这种变换:
把一个位于窗口中心的矩形放大5倍,而且旋转30度。这些变形都是以该矩形的中心点为准。
上面的动作分解为,
一是将图像平移到坐标原点,
二是放大,三是旋转。
对应的三个Matrix为
1
Matrix m = new Matrix(1, 0, 0, 1, this.Width/2, this.Height/2); //平移
2
Matrix s = new Matrix(5, 0, 0, 5, 0, 0); //放大
3
Matrix r = new Matrix((float) Math.Cos(30), (float) Math.Sin(30), (float) -Math.Sin(30), (float) Math.Cos(30), 0, 0); //旋转
4

2

3

4

再利用矩阵运算,将三个矩阵相乘后所得的新矩阵赋值给g.Transform.
1
m.Multiply(s);
2
m.Multiply(r);
3
g.Transform = m;
4
g.DrawPath(Pens.Black, gp);
5

2

3

4

5

完整代码:
1
GraphicsPath gp = new GraphicsPath();
2
Point[] points = new Point[] {new Point(40, 40), new Point(40, -40), new Point(-40, -40), new Point(-40, 40)};
3
gp.AddLine(points[0], points[1]);
4
gp.AddLine(points[1], points[2]);
5
gp.AddLine(points[2], points[3]);
6
gp.AddLine(points[3], points[0]);
7
Matrix m = new Matrix(1, 0, 0, 1, this.Width/2, this.Height/2); //平移
8
Matrix s = new Matrix(5, 0, 0, 5, 0, 0); //放大
9
Matrix r = new Matrix((float) Math.Cos(30), (float) Math.Sin(30), (float) -Math.Sin(30), (float) Math.Cos(30), 0, 0); //旋转
10
Graphics g = this.CreateGraphics();
11
m.Multiply(s);
12
m.Multiply(r);
13
g.Transform = m;
14
g.DrawPath(Pens.Black, gp);
15
g.TranslateTransform(this.Width/2, this.Height/2); //将坐点原点重设在窗口的中点。
16
g.DrawPath(Pens.Black, gp);
17
g.Dispose();

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

上面代码的操作结果为: