WPF绘图(一):几何(Geometry)与形状(Shape)
1. Geometry
在数学中,我们可以用一个方程描述圆:x2+y2=25。这个方程描述的是,一个半径为5,中心点在(0,0)的圆。这种纯数学的描述就是Geometry(几何)。
但此时,这个“圆”我们是看不见,摸不着的。如果想要看到这个几何图形,就必须用画笔,颜色等信息,去“绘制”它。
.Net中,Geometry类就是用于描述这种几何图形的类。它只包含描述几何图形的必要属性,并提供包括命中测试、动画等功能。它派生出以下七个类,以简化对图形的描述:
|
类名
|
功能
|
|
LineGeometry
|
直线
|
|
EllipseGeometry
|
椭圆(圆也是椭圆的一种)
|
|
RectangleGeometry
|
矩形
|
|
PathGeometry
|
路线(类似与随手画的一条任意线)
|
|
GeometryGroup
|
几何图形组(把多个几何图形放在一起)
|
|
CombinedGeometry
|
组合图形(将多个几何图形做布尔运算)
|
|
StreamGeometry
|
它是PathGeometry的轻量级对象。
|
1.1 LineGeometry
它表示一条直线。
它主要属性有EndPoint和StartPoint,用于定义直线的终点和起点。
Point start = new Point(0,0);
Point end = new Point(50,50);
LineGeometry line = new LineGeometry(start,end);
1.2 EllipseGeometry
它表示一个椭圆(圆也是椭圆的一种)。
它主要属性有Center(中心点坐标)、RadiusX(x轴半径)、RadiusY(Y轴半径)。
Point center = new Point(50,50);
EllipseGeometry ellipseGeo = new EllipseGeometry(center , 45, 20);
1.3 RectangleGeometry
它表示一个矩形(正方形也是矩形的一种)。
它主要属性有Rect(矩形框)、RadiusX(x轴半径)、RadiusY(y轴半径)。当定义了Rect属性后,RadiusX和RadiusY的值也就确定了;当给定了RadiusX和RadiusY的值,Rect属性的值也就确定了。
RectangleGeometry rect = new RectangleGeometry(10,20);
1.4 PathGeometry
它表示一条路线。这条路线中,可以有直线给,也可以有曲线。
它最重要的属性是Figures(路径图元),类型是PathFigureCollection,意味着它是一个集合,可以装载多个PathFigure对象。
PathFigure类,有一个重要的属性Segments,类型是PathSegmentCollection,意味着它也是一个集合,可以装载多个PathSegment(路径中的一部分)对象。
由此可见:多个Segment组成了一个PathSegmentCollection(PathFigure的Segment属性);多个PathFigure组成了一个PathFigureCollection(PathGeometry的PathFigure属性)。
// 定义SegmentCollection1
LineSegment line1 = new(...); // 定义直线部分
PolyLineSegment pline1 = new (...); // 定义多段线部分
ArcSegment arc1 = new(...); // 定义弧形线段部分
PathSegmentCollection segments1 = new(new PathSegment[] { line1, pline1, arc1 }); // 定义PathSegment集合
PathFigure path1 = new(new Point(0, 0), segments1, false); // 定义第一个的PathFigure
// 定义SegmentCollection2
LineSegment line2 = new(...);
BezierSegment beszier = new(...); // 定义Bezier曲线部分
PathSegmentCollection segments2 = new(new PathSegment[] { line2, beszier });
PathFigure path2 = new(new Point(300, 0), segments2, false); // 定义第二个的PathFigure
// 定义PathFigureCollection
PathFigureCollection pathFigures = new(new PathFigure[] { path1, path2 });
PathGeometry pathGeo = new() { Figures = pathFigures }; // 定义PathGeometry

备注:.Net提供“路径标记语法”用于简化PathFigures的创建。
1.5 GeometryGroup
它表示多个集合图形的集合。
它的主要属性有Children(包含的子图形),类型是GeometryCollection,意味着它可以可以装载多个Geometry对象。
LineGeometry lineGeo = new();
RectangleGeometry rectGeo = new();
PathGeometry pathGeo = new();
GeometryGroup geoGroup = new() { Children = new GeometryCollection() { lineGeo, rectGeo, pathGeo } };
GeometryGroup中的几何图形,也可以设置FillRule属性,以设置多个几何图形交叉区域的合并方式。
1.6 CombinedGeometry
它表示一个,由两个几何图形组合而成的图形。
它的主要属性有Geometry1(几何图形1)、Geometry2(几何图形2)、GeometryCombineMode(图形结合的方式)
RectangleGeometry rectGeo = new();
PathGeometry pathGeo = new();
CombinedGeometry CombineGeo = new(GeometryCombineMode.Exclude, rectGeo, pathGeo);
备注:
- 该类的GeometryCombineMode指的是多个图形的“结合”方式,这种方式通常指的是布尔运算;而部分Geometry对象的FillRule,指的是交叠的图形的“填充”方式。指的是图形的重叠闭合区域的“填充”方式;
- 虽然CombineGeometry只能“结合”两个Geometry对象。但是要注意,Geometry1和Geometry2的类型都是Geometry,意味只要只要是Geometry的子类,都可以赋值给这两个属性。因此,可以将多个Geometry填到GemetryGroup中,也可以两两CombinedGeometry,然后再将CombinedGeometry再CombinedGeometry。
1.7 StreamGeometry
它是PathGeometry的轻量级表示,不支持数据绑定、动画或修改。
这意味着,如果PathGeometry占用太多资源,且不需要数据绑定、动画、修改等功能,可以用StreamGeometry来替代。
它的工作原理是创建一个StreamGeometryContext对象,并在这个对象中绘制图形。所以,它没有图形数据相关的属性,
StreamGeometry streamGoe = new();
StreamGeometryContext context = streamGoe.Open();
context.ArcTo(...); // SteamGeometryContext类提供了多种绘图方法。 context.PolyLineTo(...);
context.Close();
2. Shape
形状(Shape),就是一个能看得到的几何图形。例如我们在白纸上,用红色的笔画一条直线,一个矩形。
由此可见,Shape的本质,就是在几何图形(Geometry)的基础上,加上画笔,颜色等信息,绘制而成。
.Net中,Shape就是表示“形状”的类。它是一个抽象类,继承自FrameworkElement,这意味着它是一个元素,可以直接显示在窗体上。
Shape类派生出了以下几个类:
|
类型
|
功能
|
|
Ellipse
|
椭圆形
|
|
Line
|
直线
|
|
Path
|
路径
|
|
Polygon
|
多边形
|
|
Polyline
|
多段线
|
|
Rectangle
|
矩形
|
这些类都比较容易使用,就不再一一赘述。
WPF绘图(一):几何(Geometry)与形状(Shape)的更多相关文章
- WPF 10天修炼 第八天 - 形状、画刷和变换
图形 在WPF中使用绘图最简单的就是使用Shape类.Shape类继承自FrameworkElement,是一个专门用来绘图的类.Shape类中年派生的类有直线.矩形.多边形和圆形等. System. ...
- 利用WPF绘图
C#入门经典 25章的一个例子,利用WPF绘图. XAML: <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/p ...
- FastReport.Net使用:[18]形状(Shape)控件用法
FastReport中,如果要画一张漂亮的报表,经常会画些形状控件来美化?那么如何用好形状(Shape)控件呢? 形状的5种类型 在工具栏的图形控件下拉菜单中有5种类型(矩形.圆角矩形.椭圆形.三角形 ...
- 18 UI美化自定义形状shape
自定义某个控件的形状 如 圆角 巨型 环形 : 在工程文件的新建 res/drawable/shape文件(以下键一个圆角) <?xml version="1.0" enco ...
- WPF 反射加载Geometry几何图形数据图标
相信大家在阅读WPF相关GitHub开源项目源码时都会看见一串串这种数据 这种Geometry数据就是几何图形数据 为什么要用Geometry数据做图标? 有一种做法是使用ttf字体文件代替,不过使用 ...
- 【R绘图】当图例映射color/shape等多个属性时,如何修改图例标题?
一般而言,我们修改ggplot2图例标题,常用以下三种方法: + guides(fill=guide_legend(title="New Legend Title")) + lab ...
- 关于WPF绘图中的path.data在后台重新赋值的语法
//XAML语法 <Path Name="path_M" Fill="LawnGreen" Data="M 0 0 L 100 0 L 100 ...
- WPF 绘图 和动画
wpf 的动画:https://www.cnblogs.com/TianFang/p/4050845.html
- WPF绘图性能问题
代码: /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWind ...
- wpf 绘图
随机推荐
- 2023-07-08:RabbitMQ如何做到消息不丢失?
2023-07-08:RabbitMQ如何做到消息不丢失? 答案2023-07-08: 1.持久化 发送消息时设置delivery_mode属性为2,使消息被持久化保存到磁盘,即使RabbitMQ服务 ...
- P3574 [POI2014] FAR-FarmCraft 吐槽 + 题解
洛谷上面的题解写的真的不太好,有很多错误,我来谈谈自己的理解. 设 \(f[i]\) 表示以 \(i\) 为根节点的子树中(包括节点 \(i\))的所有人安装好游戏所需要的时间(与下面的 \(g[i] ...
- 《Among Us》火爆全球,实时语音助力派对游戏开启第二春
今年在全球"宅经济"的影响下,社交派对类游戏意外的迎来了爆发. 8月份,<糖豆人:终极淘汰赛>突然爆火,创造了首日150万玩家.首周Steam 200万销量.单周Twi ...
- Stable Diffusion生成图片的参数查看与抹除方法
前几天分享了几张Stable Diffusion生成的艺术二维码,有同学反映不知道怎么查看图片的参数信息,还有的同学问怎么保护自己的图片生成参数不会泄露,这篇文章就来专门分享如何查看和抹除图片的参数. ...
- Linux 命令:ps
ps -ef ps -e f # 树形显示
- KVM "shutting down, reason=crashed" 问题处理
打开debug日志抓取信息 2022-10-12 07:42:43.698+0000: 63115: debug : processMonitorEOFEvent:4814 : Monitor con ...
- 记录一次线上服务CPU飙高问题
2023.07.20 20:01:38线上一个服务发生了CPU过高的告警, 看告警信息当前的CPU使用率已经达到了82.65%,问题已经很严重,赶紧开始排查起来.来复盘下如何排查这类问题, 一.排查方 ...
- VScode 中golang 单元测试,解决单元测试超时timeout30s
目的:单元测试的主要目的是验证代码的每个单元(函数.方法)是否按照预期工作. 提示:解决单元测试超时30s的问题在序号4 1 准备以_test.go结尾文件和导入testing包 在命名文件时需要让文 ...
- Linux文件与目录管理核心命令:看这篇就够了
Linux文件与目录核心命令 Linux命令操作语法示例 #命令 选项 参数 command [-options] [arguments] [root@localhost ~]# ls //命令 an ...
- 用 Tensorflow.js 做了一个动漫分类的功能(二)
前言: 前面已经通过采集拿到了图片,并且也手动对图片做了标注.接下来就要通过 Tensorflow.js 基于 mobileNet 训练模型,最后就可以实现在采集中对图片进行自动分类了. 这种功能在应 ...