之前在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的更多用法后面介绍。

GraphicsPaths和Regions相关推荐

  1. [LeetCode] 130. Surrounded Regions Java

    题目:Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by 'X'. A ...

  2. [leetcode]Surrounded Regions @ Python

    原题地址:https://oj.leetcode.com/problems/surrounded-regions/ 题意: Given a 2D board containing 'X' and 'O ...

  3. Reconstructing complex regions of genomes using long-read sequencingtechnology

    Reconstructing complex regions of genomes using long-read sequencingtechnology 对复杂区域大片段重复序列的组装仍然是基因组 ...

  4. RCNN (Regions with CNN) 目标物检测 Fast RCNN的基础

    RCNN (Regions with CNN) 目标物检测 Fast RCNN的基础 Abstract: 贡献主要有两点1:可以将卷积神经网络应用region proposal的策略,自底下上训练可以 ...

  5. LeetCode: Surrounded Regions [130]

    [题目] Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is cap ...

  6. RCNN (Regions with CNN) 目标物检测

    转载自: RCNN (Regions with CNN) 目标物检测 Fast RCNN的基础 - 楼燚航的blog - 博客园 http://www.cnblogs.com/louyihang-lo ...

  7. 04_05_06:设置线型风格(设置线型风格)、区域着色 (Shading Regions)、设置Spines

    4.设置线型风格 4.1.设置线型风格 5.区域着色 (Shading Regions) 6.设置Spines 4.设置线型风格 4.1.设置线型风格 可以使用绘图函数的linestyle或ls参数来 ...

  8. .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)...

    不知你是否见过 try { } finally { } 代码中,try 块留空,而只往 finally 中写代码的情况呢?这种写法有其特殊的目的. 本文就来说说这种不一样的写法. 本文内容 空的 tr ...

  9. ural1147 Shaping Regions

    Shaping Regions Time limit: 0.5 second Memory limit: 64 MB N opaque rectangles (1 ≤ N ≤ 1000) of var ...

最新文章

  1. 20万个法人、百万条银行账户信息,正在暗网兜售
  2. vim graphics
  3. 计算机网络基础实验简答题,计算机网络基础实验报告.doc
  4. 判断一个点是否在多边形区域内--C算法
  5. 学计算机有哪些大学专业,计算机专业:最好的7所大学!也是全中国“最难考”的大学!...
  6. 第05讲:多路加速,了解多线程基本原理
  7. TensorFlow实战Google深度学习框架5-7章学习笔记
  8. iLogtail使用入门-iLogtail本地配置模式部署(For Kafka Flusher)
  9. 帆软条件判断是否包含指定字符串
  10. 视差图Disparity与深度图Depth Map的一点知识
  11. 【Pyecharts50例】GEO航线图/lines
  12. udhcpc 和 udhcpd
  13. 显卡测试软件 温度,显卡温度检测软件
  14. 饮茶而思其源,中国茶叶之起源
  15. 视频主观质量评价方法总结
  16. 利用spring的jdbcTemplate处理blob、clob
  17. BGP学习笔记更新版
  18. Flume-三大核心组件
  19. 第一阶段项目(2 body)
  20. 看透设计模式-实践与总结

热门文章

  1. T5周:运动鞋品牌识别
  2. 表单的提交方式get和post的区别
  3. 又发现了一个看网络电视的好软件
  4. SpringBoot +Redis +RabbitMQ 实现高并发限时秒杀
  5. OCR文字识别项目(原理)
  6. centos7 部署glusterfs集群,服务端和客户端演示
  7. netty入门前置知识-NIO
  8. matlab rbf核函数,四类核函数(Sigmoid+RBF)
  9. U盘插入电脑不显示的解决办法
  10. 蓝牙打印机安卓打印错乱的原因