GraphicsPaths和Regions

来源:互联网 发布:python分布式框架 编辑:程序博客网 时间:2024/05/14 10:02

之前在Graphics类中,简单提到在界面上创建图形,在前面也绘制了一些图形如直线和矩形等。这里就简单实例一遍:

Graphics g = e.Graphics;
            g.DrawLine(new Pen(Brushes.Black,5), new Point(5, 2), new Point(5, 50)); //直线

            g.DrawRectangle(Pens.Black, 20, 2, 80, 60);  //矩形

            g.DrawEllipse(new Pen(Brushes.Black, 5), new Rectangle(120, 2, 80, 60));  //椭圆

            g.DrawBezier(new Pen(Brushes.Black,5),new Point(220, 20),new Point(220,60),new Point(240, 10),new Point(260,80));    //贝塞尔曲线

            g.DrawPolygon(new Pen(Brushes.Black,5),new Point[]{new Point(0,100),new Point(200,200),new Point(0,150)});        //多边形

如图:

这都是一些比较规则的,当然DrawPolygon也能画不规则多边形。这里介绍两个类,可以处理不规则的形状,还可以把一组形状组合起来,进来高效处理。这两个类就是GraphicsPath和Region。联合使用这两个类,可以建立更高级的抽象层,创建出更简单、更清晰的代码。

简单的说:GraphicsPath对象是一个由有顺序的一组图形组成的路径,图形可以是线段、曲线段和几何图形组成,因为有顺序,所有必有起点和终点。GraphicsPath对象中的图形可以是不连接的。Region类与GraphicsPath路径相似,但它与区域相关。因此可以用Region对象表示一个形状或一组形状。Region可以包含几何形状或定制的形状,其轮廓是由指定的直线或曲线组成,和GraphicsPath一样,组成Region的形状不必是相连接的。

一旦创建了一个GraphicsPath对象,就可以使用Pen对象在绘图表面绘制路径,在构建了Region对象后,就可以使用Brush对象填充区域了。

GraphicsPath类

GraphicsPath类在System.Drawing.Drawing2D命名空间中,使用时添加该引用。

先给个示例,还是修改Form1_Paint方法中的代码:

Graphics g = e.Graphics;
            g.FillRectangle(Brushes.White, this.ClientRectangle);

            GraphicsPath gp = new GraphicsPath();

            gp.AddLine(10, 10, 10, 50);
            gp.AddBezier(10, 50, 10, 55, 25, 70, 30, 70);
            gp.AddLine(30, 70, 60, 70);
            //闭合图形
            gp.CloseFigure();
            //再创建一个图形
            gp.StartFigure();
            gp.AddLine(60, 110, 40, 160);
            gp.AddLine(40, 160, 60, 180);
            gp.AddLine(60, 180, 140, 150);
            gp.AddLine(140, 150, 120, 110);
            //GraphicsPath类本身没有提供显示创建路径的功能,所以需要把路径对象传给Graphics类的一个方法来显示
            g.DrawPath(Pens.Black, gp);

            gp.Dispose();
            g.Dispose();

效果图:

给路径填充:

g.FillPath(Brushes.Orange, gp);//给路径填充橘黄色,可以自己试一下效果。

GraphicsPath属性和方法

可以自己F12查看. GraphicsPath类的5个公共属性:

Graphics类的方法有很多,示例中用的比较多的是add开头的为路径添加图形的方法,这里就不列出了。


Region类

从GraphicsPath对象中创建区域,利用上述示例的代码:

Graphics g = e.Graphics;
            g.FillRectangle(Brushes.White, this.ClientRectangle);

            GraphicsPath gp = new GraphicsPath();

            gp.AddLine(10, 10, 10, 50);
            gp.AddBezier(10, 50, 10, 55, 25, 70, 30, 70);
            gp.AddLine(30, 70, 60, 70);
            //闭合图形
            gp.CloseFigure();
            //再创建一个图形
            gp.StartFigure();
            gp.AddLine(60, 110, 40, 160);
            gp.AddLine(40, 160, 60, 180);
            gp.AddLine(60, 180, 140, 150);
            gp.AddLine(140, 150, 120, 110);

            //g.FillPath(Brushes.Orange, gp);//填充颜色
            
            //GraphicsPath类本身没有提供显示创建路径的功能,所以需要把路径对象传给Graphics类的一个方法来显示
            //g.DrawPath(Pens.Black, gp);
            Region reg = new Region(gp);   //从GraphicsPath对象创建Region对象
            //填充区域
            g.FillRegion(Brushes.Green, reg);

            reg.Dispose();
            gp.Dispose();
            g.Dispose();

效果图:

可以看到,在处理Region对象时,先要定义包含什么区域,然后再进行区域的操作(与GraphicsPath类似)。

区域的创建都是依靠Region类的重载:

1.从路径中创建:上述示例

2.从各类图形中创建:

Region reg = new Region(new Rectangle(10, 10, 80, 20));

3.从一个区域中创建另一个区域

Region r1 = new Region(new Rectangle(10, 10, 80, 20));

RegionData r1Data = r1.GetRegionData();//区域数据

Region r2 = new Region(r1Data);  //构造函数不接受区域对象本身,可以接受区域数据数组。

4.区域的并集和交集

示例:

Graphics g = e.Graphics;
            Rectangle rect1 = new Rectangle(50, 10, 50, 130);
            Rectangle rect2 = new Rectangle(10, 50, 130, 50);
            //设置Region为第一个矩形
            Region reg = new Region(rect1);
            //用Rect2提取Region中的交集
            reg.Intersect(rect2);

            g.FillRegion(Brushes.Orange, reg);
            g.DrawRectangle(Pens.Black, rect1);
            g.DrawRectangle(Pens.Black, rect2);

如图:

区域可以进行代数操作,有如下5个方法:

对应效果:

Region类的方法有很多,点击查看。

GraphicsPath和Region的更多用法后面介绍。


0 0
原创粉丝点击