二维图形几何变换有平移,缩放,旋转,错切,反射等几种。
二维图形由点或直线段组成的,而直线段又由两个端点连接而成的,从而对二维图形的变换都全部转换成点的变换。
所以下面我们就点的变换原因来讨论。
在讨论下面的问题之前,我们得先学习一个 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为
2Matrix s = new Matrix(5, 0, 0, 5, 0, 0); //放大
3Matrix r = new Matrix((float) Math.Cos(30), (float) Math.Sin(30), (float) -Math.Sin(30), (float) Math.Cos(30), 0, 0); //旋转
4
再利用矩阵运算,将三个矩阵相乘后所得的新矩阵赋值给g.Transform.
2m.Multiply(r);
3g.Transform = m;
4g.DrawPath(Pens.Black, gp);
5
完整代码:
2Point[] points = new Point[] {new Point(40, 40), new Point(40, -40), new Point(-40, -40), new Point(-40, 40)};
3gp.AddLine(points[0], points[1]);
4gp.AddLine(points[1], points[2]);
5gp.AddLine(points[2], points[3]);
6gp.AddLine(points[3], points[0]);
7Matrix m = new Matrix(1, 0, 0, 1, this.Width/2, this.Height/2); //平移
8Matrix s = new Matrix(5, 0, 0, 5, 0, 0); //放大
9Matrix r = new Matrix((float) Math.Cos(30), (float) Math.Sin(30), (float) -Math.Sin(30), (float) Math.Cos(30), 0, 0); //旋转
10Graphics g = this.CreateGraphics();
11m.Multiply(s);
12m.Multiply(r);
13g.Transform = m;
14g.DrawPath(Pens.Black, gp);
15g.TranslateTransform(this.Width/2, this.Height/2); //将坐点原点重设在窗口的中点。
16g.DrawPath(Pens.Black, gp);
17g.Dispose();
上面代码的操作结果为:
转:http://www.cnblogs.com/begincsdn/archive/2005/07/14/193005.html