GraphicsPaths和Regions
之前在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相关推荐
- [LeetCode] 130. Surrounded Regions Java
题目:Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by 'X'. A ...
- [leetcode]Surrounded Regions @ Python
原题地址:https://oj.leetcode.com/problems/surrounded-regions/ 题意: Given a 2D board containing 'X' and 'O ...
- Reconstructing complex regions of genomes using long-read sequencingtechnology
Reconstructing complex regions of genomes using long-read sequencingtechnology 对复杂区域大片段重复序列的组装仍然是基因组 ...
- RCNN (Regions with CNN) 目标物检测 Fast RCNN的基础
RCNN (Regions with CNN) 目标物检测 Fast RCNN的基础 Abstract: 贡献主要有两点1:可以将卷积神经网络应用region proposal的策略,自底下上训练可以 ...
- LeetCode: Surrounded Regions [130]
[题目] Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is cap ...
- RCNN (Regions with CNN) 目标物检测
转载自: RCNN (Regions with CNN) 目标物检测 Fast RCNN的基础 - 楼燚航的blog - 博客园 http://www.cnblogs.com/louyihang-lo ...
- 04_05_06:设置线型风格(设置线型风格)、区域着色 (Shading Regions)、设置Spines
4.设置线型风格 4.1.设置线型风格 5.区域着色 (Shading Regions) 6.设置Spines 4.设置线型风格 4.1.设置线型风格 可以使用绘图函数的linestyle或ls参数来 ...
- .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)...
不知你是否见过 try { } finally { } 代码中,try 块留空,而只往 finally 中写代码的情况呢?这种写法有其特殊的目的. 本文就来说说这种不一样的写法. 本文内容 空的 tr ...
- ural1147 Shaping Regions
Shaping Regions Time limit: 0.5 second Memory limit: 64 MB N opaque rectangles (1 ≤ N ≤ 1000) of var ...
最新文章
- 20万个法人、百万条银行账户信息,正在暗网兜售
- vim graphics
- 计算机网络基础实验简答题,计算机网络基础实验报告.doc
- 判断一个点是否在多边形区域内--C算法
- 学计算机有哪些大学专业,计算机专业:最好的7所大学!也是全中国“最难考”的大学!...
- 第05讲:多路加速,了解多线程基本原理
- TensorFlow实战Google深度学习框架5-7章学习笔记
- iLogtail使用入门-iLogtail本地配置模式部署(For Kafka Flusher)
- 帆软条件判断是否包含指定字符串
- 视差图Disparity与深度图Depth Map的一点知识
- 【Pyecharts50例】GEO航线图/lines
- udhcpc 和 udhcpd
- 显卡测试软件 温度,显卡温度检测软件
- 饮茶而思其源,中国茶叶之起源
- 视频主观质量评价方法总结
- 利用spring的jdbcTemplate处理blob、clob
- BGP学习笔记更新版
- Flume-三大核心组件
- 第一阶段项目(2 body)
- 看透设计模式-实践与总结