×

二维几何图形变换及其GDI+实现(转)

Kalet Kalet 发表于2009-03-20 12:00:14 浏览173 评论0

抢沙发发表评论

二维几何图形变换及其GDI+实现(转)
2008年04月07日 17:33:48 作者: Starts(一切重新开始)
 文章出处:http://www.cnblogs.com/begincsdn/archive/2005/07/14/193005.html二维几何图形变换及其GDI+实现(转)
二维图形几何变换有平移,缩放,旋转,错切,反射等几种。
二维图形由点或直线段组成的,而直线段又由两个端点连接而成的,从而对二维图形的变换都全部转换成点的变换。
所以下面我们就点的变换原因来讨论。
在讨论下面的问题之前,我们得先学习一个 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为



1Matrix m = new Matrix(1, 0, 0, 1, this.Width/2, this.Height/2); //平移
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.


二维几何图形变换及其GDI+实现(转)
1m.Multiply(s);
2m.Multiply(r);
3g.Transform = m;
4g.DrawPath(Pens.Black, gp);
5
完整代码:



 1GraphicsPath gp = new GraphicsPath();
 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();
上面代码的操作结果为:

二维几何图形变换及其GDI+实现(转)

 



群贤毕至

访客