黑夜的狼

沮丧吗,那就是一种无病呻吟!留恋它就是一种高度近视!目光应该放得更远一点! 别不想飞,只是要一步跨过太平洋!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

二维图形几何变换有平移,缩放,旋转,错切,反射等几种。
二维图形由点或直线段组成的,而直线段又由两个端点连接而成的,从而对二维图形的变换都全部转换成点的变换。
所以下面我们就点的变换原因来讨论。
在讨论下面的问题之前,我们得先学习一个 System.Drawing.Drawing2.Matrix类,该类是坐标变换的最常用的类,当然你可以自己进行矩阵运算。

1. 平移变换:
   平移变换的变换矩阵为:  Tm= 1.GIF,对应的Matrix定义为 Matrix m = new Matrix(1,0,0,1,Mx,My);
  其中Mx是水平方向移动的距离,My是垂直方向的距离,向左负向右正,向下负向上正。

2. 缩放变换
  平移变换的变换矩阵为:  Ts= 3.GIF,对应的Matrix定义为 Matrix s = new Matrix(Sx,0,0,Sy,0,0);
其中Sx是水平方向上缩放的比例,Sy是竖直方向上缩放的比例,大小1是放大,小于1是缩小,不能小于0。

3. 旋转变换
  旋转变换的变换矩阵为: Tr=2.GIF,对应的Matrix定义为Matrix r = new Matrix(cos4.GIF,sin4.GIF,-sin4.GIF,cos4.GIF,0,0);
其中sin,cos均为三角函数,4.GIF为以原点旋转的角度数。

现举例说明如何处理这种变换:
把一个位于窗口中心的矩形放大5倍,而且旋转30度。这些变形都是以该矩形的中心点为准。

上面的动作分解为,
一是将图像平移到坐标原点,
二是放大,三是旋转。
对应的三个Matrix为

1Matrix m = new Matrix(1001this.Width/2this.Height/2); //平移
2Matrix s = new Matrix(500500); //放大
3Matrix r = new Matrix((float) Math.Cos(30), (float) Math.Sin(30), (float-Math.Sin(30), (float) Math.Cos(30), 00); //旋转
4

再利用矩阵运算,将三个矩阵相乘后所得的新矩阵赋值给g.Transform.

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(4040), new Point(40-40), new Point(-40-40), new Point(-4040)};
 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(1001this.Width/2this.Height/2); //平移
 8Matrix s = new Matrix(500500); //放大
 9Matrix r = new Matrix((float) Math.Cos(30), (float) Math.Sin(30), (float-Math.Sin(30), (float) Math.Cos(30), 00); //旋转
10Graphics g = this.CreateGraphics();
11m.Multiply(s);
12m.Multiply(r);
13g.Transform = m;
14g.DrawPath(Pens.Black, gp);
15g.TranslateTransform(this.Width/2this.Height/2); //将坐点原点重设在窗口的中点。
16g.DrawPath(Pens.Black, gp);
17g.Dispose();

上面代码的操作结果为:
5.GIF

转:http://www.cnblogs.com/begincsdn/archive/2005/07/14/193005.html

posted on 2010-12-15 07:10  anncesky  阅读(396)  评论(0编辑  收藏  举报