当前位置: 首页 > 编程日记 > 正文

WPF的二维绘图(二)——几何图形Geometry

在WPF的DrawingContext对象中,提供了基本的绘制椭圆和矩形的API:DrawEllipse和DrawRectangle。但是,这些是远远不够用的,我们在日常应用中,更多的是使用DrawGeometry函数,它可以绘制更多复杂的几何图形,并且提供了许多强大而易用的函数,在大多数场景下,甚至可以取代DrawEllipse和DrawRectangle函数。

在WPF图形体系中,Geometry类表示几何图形的基类,使用的时候是实例化它的一些子类,具体的有:

基本几何图形

  • 线段:LineGeometry
  • 矩形:RectangleGeometry
  • 椭圆:EllipseGeometry

几何图形集合

路径集合图形PathGeometry里可以包含一系列几何图形集合,常见的有:

  • 线段: LineSegment
  • 弧:ArcSegment

贝塞尔曲线:贝塞尔曲线系列还比较多,具体有如下几种:

  1. BezierSegment:在两个点之间创建一条三次方贝塞尔曲线。
  2. PolyBezierSegment:创建一系列三次方贝塞尔曲线。
  3. PolyQuadraticBezierSegment:创建一系列二次贝塞尔曲线。
  4. QuadraticBezierSegment:创建一条二次贝塞尔曲线。

除了这种组合的方式之外,系统还提供了一个通过一系列API来绘制的StreamGeometry。它不支持绑定,动画,相应也更加灵活而高效。

    StreamGeometry geometry = new StreamGeometry;

    using (StreamGeometryContext ctx = geometry.Open())
    {
        ctx.BeginFigure(new Point(10, 100), true , true);
        ctx.LineTo(new Point(100, 100), true , false);
        ctx.LineTo(new Point(100, 50), true, false);
    }

复合几何图形

使用 GeometryGroup、CombinedGeometry 或者通过调用静态的 Geometry 方法 Combine,可以创建复合几何图形对象。它们主要的区别是:

  • CombinedGeometry 对子图形进行叠加操作,没有面积的子图形将被丢弃。只能组合两个子图形(但是这两个子图形也可以是复合几何图形)。
  • GeometryGroup 只进行组合,而不进行面积叠加。可以添加多个子图形。有关示例,请参见如何:创建复合形状。

CombinedGeometry的叠加方式有四种:Union、Intersect、Exclude 和 Xor,它们的效果为:

这些在我们的日常应用中是非常有用的,具体示例请参看MSDN文章: 如何:创建复合形状和如何:创建组合的几何图形。

常用方法

Geometry对象中本身还包含了一系列非常有用的方法,如:

  • GetArea - 获取 Geometry 的面积。
  • FillContains - 确定是否包含其他 Geometry。
  • StrokeContains - 确定是否包含指定的点。
  • Bounds:获取外接矩形

这些都是非常常用的方法,例如FillContains,StrokeContains用于鼠标命中测试是非常方便的。

呈现方式

Geometry对象并不能作为图像独立呈现出来,它一般有如下几种呈现方式:

在Path中呈现:

可以作为GeometryDrawing.Geometry的参数呈现为Path对象

    <Path Stroke="Black" StrokeThickness="1" ><Path.Data><LineGeometry StartPoint="10,20" EndPoint="100,130" /></Path.Data></Path>

这种方式下写一些简单的几何图形还行,但对于PathGeometry来说有些冗繁,因此XAML采用了一种简单的路径标记语法来简化这一过程,

    <Path Stroke="Black" Fill="Gray"><Path.Data><PathGeometry Figures="M 10,100 C 10,300 300,-200 300,100" /></Path.Data></Path>

甚至可以直接简化为:

    <Path Stroke="Black" Fill="Gray" Data="M 10,100 C 10,300 300,-200 300,100" />

这种语法在一些第三方矢量图转换过来的文件中非常常见,如果能熟练掌握的话,写一些简单的几何图形也是非常方便的。

在DrawingContext中呈现

可以作为DrawingContext. DrawGeometry的参数呈现,这种方式后面的文章中做会更多的说明,这里就不多介绍了。

在GeometryDrawing中呈现

可以作为GeometryDrawing.Geometry的参数呈现为Drawing对象

    <GeometryDrawing Brush="MediumBlue"><GeometryDrawing.Geometry><GeometryGroup><EllipseGeometry RadiusX="20" RadiusY="45" Center="50,50" /><EllipseGeometry RadiusX="45" RadiusY="20" Center="50,50" /></GeometryGroup></GeometryDrawing.Geometry></GeometryDrawing>

当然,Drawing对象也不能独立呈现,一般是作为DrawingBrush或作为DrawingContext.DrawDrawing的参数来使用的

其它用途:

作为UIElement.Clip参数裁剪控件

    <Image Source="sampleImages\Waterlilies.jpg" Width="200" Height="150" HorizontalAlignment="Left"><Image.Clip><EllipseGeometry RadiusX="100" RadiusY="75" Center="100,75"/></Image.Clip></Image>

另外,也常用在DrawingGroup.ClipGeometry和DrawingContext.PushClip中裁剪图像。

作为DoubleAnimationUsingPath. PathGeometry属性生成路径动画

可以将PathGeometry 对象定义的几何路径旋转(转动)对象的路径。

小结

Geometry的功能是非常强大的,本文这里只是对其主要功能做了一个简单的介绍,后面的文章中,将会更多的用例子来介绍一下它的用法。

相关文章:

定期删除各子文件下数据

最近遇到一个客户有这样一个需求&#xff0c;需要在每日自动删除各用户文件夹下的数据而不删除根文件夹和每个用户父文件夹 Register-ScheduledJob -Name Remove-InternetDataFiles -ScriptBlock {$root "E:\Internet-Data"$dirs Get-ChildItem $root -Directoryfo…

PHP使用BC Math 函数处理浮点运算问题

BC Math 函数 http://cn.php.net/manual/zh/ref.bc.php做小数的相加减问题是&#xff0c;出现了浮点运算不准的情况&#xff0c;看来都说解释型语言对于浮点运算都会有问题的说法是真的。首先看一段代码: <?php$a 0.1;$b 0.7;var_dump(($a $b) 0.8); 打印出来的值居然为…

【重建】从FJOI2016一试谈起

2016.2.21 我是湖建的sb蒟蒻OIer FOIWCFJOI2016 体验性的旅途&#xff0c;新生 其实是刚刚找回密码闲的没事干 前排膜FZSZ各位学长 ORZ 闫神 ORZ 吴大爷 ORZ 汪巨 ORZ 邵司机 ORZ 方老师ORZ dxy zkp zzy 湖建省选一试被虐。不知道明年这个时候会有什么改变 总而言之&#xff…

是否正常正常是

数组-136. 只出现一次的数字题目描述题目样例Java方法&#xff1a;位运算算法思路代码复杂度题目描述 给定一个非空整数数组&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 题目样例 示例1&#xff1a; 输入: […

pkg mysql 在macOS 上的管理

为什么80%的码农都做不了架构师&#xff1f;>>> 使用pkg安装后&#xff0c;在设置中启停&#xff0c;通过ps -ef|grep mysql查看进程的命令行即可看到各配置位置。 转载于:https://my.oschina.net/fox99/blog/1931674

PHP autoload 函数

(1) autoload机制概述 在使用PHP的OO模式开发系统时&#xff0c;通常大家习惯上将每个类的实现都存放在一个单独的文件里&#xff0c;这样会很容易实现对类进行复用&#xff0c;同时将来维护时也很便利。这也是OO设计的基本思想之一。在PHP5之前&#xff0c;如果需要使用一个…

sql按条件进行批量查询或update的关键字in

2019独角兽企业重金招聘Python工程师标准>>> SELECT t1.field1,t1.field2,t1.field3 from t1 where t1.pid in (select fid from t2 where t2.ch%123456%) 再看这段代码&#xff0c; select t.* from mefinance.me_customer_info t where t.id in (3285,4241,4243,4…

为什么很努力进步却不明显

今天有个玩的不错的同事问了我一个问题&#xff1a;他说我今年在努力学习测试方法&#xff0c;自动化测试等等&#xff0c;也写了不少测试用例&#xff0c;但总体感觉好像没有什么进步啊&#xff1f;他想不明白这是什么原因。其实当我遇到这个问题的时候&#xff0c;我也想了一…

spl_autoload_register与autoload区别

spl_autoload_register(PHP 5 > 5.1.2)spl_autoload_register — 注册__autoload()函数说明bool spl_autoload_register ([ callback $autoload_function ] )将函数注册到SPL __autoload函数栈中。如果该栈中的函数尚未激活&#xff0c;则激活它们。如果在你的程序中已经实现…

宣传部vv从v

数组-136. 只出现一次的数字题目描述题目样例Java方法&#xff1a;位运算算法思路代码复杂度题目描述 给定一个非空整数数组&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 题目样例 示例1&#xff1a; 输入: […

自动配置IPv4问题

对于 Windows &#xff0c; 配置 IP&#xff0c;如&#xff1a; 192.168.1.101&#xff0c; 如果这个 IP 已经在局域网内存在&#xff0c;那么将会提示局域网内已经存在该 IP。 而这个时候&#xff0c;Windows 7 将产生一个 “自动配置IPv4地址”&#xff0c;如&#xff1a;169…

营销自动化为什么能吸引企业的喜欢?它有何魅力?

在一次营销峰会上&#xff0c;我们听到这样一个令人惊讶的描述&#xff1a;“到2020年底&#xff0c;将会有85%的客户与企业的关系在没有人际互动的情况下进行管理。”虽然这听起来可能有点超前&#xff0c;但从营销的角度来看&#xff0c;“未来”已来。这个“未来”就是我们所…

php base64解码图片 base64加密图片还原

<?php//文件名:base64.php $data"/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2MBERISGBUYLxoaL2NCOEJjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY//AABEIADIA…

python mysql

2019独角兽企业重金招聘Python工程师标准>>> python实践3&#xff1a;cursor() — 数据库连接操作 (2012-05-07 11:00:40) 转载▼ 标签&#xff1a; itpython 操作数据库&#xff0c;要安装一个Python和数据库交互的包MySQL-python-1.2.2.win32-py2.5.exe&#xff0…

程序员效率低下的35个坏习惯

优秀程序员与平庸程序员的最终差别其实是习惯&#xff0c;避开那些让自己低效的坏习惯是程序员让自己变优秀的有效途径。 1.总是说“一会弄好”&#xff0c;但从来不兑现。&#xff08;缺乏任务管理和时间管理能力&#xff09;2坚持所谓的高效、优雅的“一行代码流”&#xff0…

PHP处理Oracle的CLOB

1. 写入数据在使用PDO的预处理方法时&#xff0c;如果使用bindParam()等而不指定字段的数据类型或使用execute()&#xff0c;PDO都会默认为string类型&#xff0c;并且限定一个默认长度 所以在存clob类型字段时必须使用bindParam()或bindValue()等&#xff0c;并指定字符…

c# 元组Tuple

Tuple类型像一个口袋&#xff0c;在出门前可以把所需的任何东西一股脑地放在里面。您可以将钥匙、驾驶证、便笺簿和钢笔放在口袋里&#xff0c;您的口袋是存放各种东西的收集箱。C# 4.0引入的一个新特性 Tuple类型与口袋类似&#xff0c;它可以存放不同类型的对象。CodeProject…

KVM之安装虚拟机

一、KVM安装&#xff1a;环境要求&#xff1a;1、如果是物理服务器&#xff0c;需要在BIOS中打开虚拟化VirtualizationTechnology一般的服务器默认是打开这个功能的。 2、如果是用VMware Workstation做实验&#xff0c;建立的虚拟机的CPU要勾选虚拟化功能&#xff0c;这样虚拟机…

使用 Strace 调试工具

strace是Linux环境下的一款程序调试工具&#xff0c;用来监察一个应用程序所使用的系统呼叫及它所接收的系统信息。 strace是一个有用的小工具&#xff0c;它可以通过跟踪系统调用来让你知道一个程序在后台所做的事情。Strace是一个基础的调试工具&#xff0c;在大多数Linux系 …

java——网络知识积累

1.获得局域网的所有主机ip地址 ping ip 等待每次回复的超时时间&#xff1a; -w 280 要发送的回显请求数&#xff1a;-n 1 Process processRuntime.getRuntime().exec("ping "); process.getInputStream()----InputStreamReader()----BufferReader in…

卸载v吧v字典序

数组-136. 只出现一次的数字题目描述题目样例Java方法&#xff1a;位运算算法思路代码复杂度题目描述 给定一个非空整数数组&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 题目样例 示例1&#xff1a; 输入: […

《JavaScript高级程序设计(第3版)》教程大纲

词条 《JavaScript高级程序设计》是2006年人民邮电出版社出版的图书&#xff0c;作者是(美)(Nicholas C.Zakas)扎卡斯。本书适合有一定编程经验的开发人员阅读&#xff0c;也可作为高校相关专业课程的教材。 献给搬砖人士&#xff0c;求职人士很不错的基础扎实笔记 前四章 js诞…

鸡肋的PHP单例模式

单例模式的要点有三个&#xff1a;一是某个类只能有一个实例&#xff1b;二是它必须自行创建这个实例&#xff1b;三是它必须自行向整个系统提供这个实例。<?php /* 单例模式举例,其要点如下: * * 1. $_instance 必须声明为静态的私有变量 * 2. 构造函数和克隆函数必须声明…

彻底理解js中this

相关博文&#xff1a;http://blog.csdn.net/libin_1/article/details/49996815彻底理解js中this的指向&#xff0c;不必硬背。 首先必须要说的是&#xff0c;this的指向在函数定义的时候是确定不了的&#xff0c;只有函数执行的时候才能确定this到底指向谁&#xff0c;实际上t…

cvsdfgdfdf

数组-136. 只出现一次的数字题目描述题目样例Java方法&#xff1a;位运算算法思路代码复杂度题目描述 给定一个非空整数数组&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 题目样例 示例1&#xff1a; 输入: […

怎样操作vue.js使用3DES加密

如何在VUE-CLI手脚架建立的工程中使用3des加密&#xff1a; 1npm install crypto-js --save-dev1import CryptoJS from crypto-js123456789101112131415161718192021222324252627//DES加密 Pkcs7填充方式encryptByDES(message, key){const keyHex CryptoJS.enc.Utf8.parse(key…

PHP 函数 ignore_user_abort定时执行任务的实现

ignore_user_abort 设置与客户机断开是否会终止脚本的执行。本函数返回 user-abort 设置的之前的值&#xff08;一个布尔值&#xff09;。int ignore_user_abort ([ string $value ] )参数描述setting可选。如果设置为 true&#xff0c;则忽略与用户的断开&#xff0c;如果设置…

echarts树图节点垂直间距_矿棉板吊顶标准工艺节点

材料探秘materials材料版块【矿棉板吊顶标准工艺】 材料探秘关键词&#xff1a;#吊杆与设备#吊顶龙骨#矿棉板#1 吊杆与设备相遇增加过桥节点图 ■ 本工艺管控要点◎ 顶面的水、电、风专业强制定位、预留、预埋必须全部完成&#xff0c;且电气穿线、测试完成并合格&#xf…

队列 queue

STL: 队列中pop完成的不是取出最顶端的元素,而是取出最低端的元素.也就是说最初放入的元素能够最先被取出(这种行为被叫做FIFO:First In First Out,即先进先出). queue:front 是用来访问最底端数据的函数. 1 #include <queue>2 #include <cstdio>3 uisng namespace…

Android精通:View与ViewGroup,LinearLayout线性布局,RelativeLayout相对布局,ListView列表组件...

UI的描述 对于Android应用程序中&#xff0c;所有用户界面元素都是由View和ViewGroup对象构建的。View是绘制在屏幕上能与用户进行交互的一个对象。而对于ViewGroup来说&#xff0c;则是一个用于存放其他View和ViewGroup对象的布局容器&#xff01; Android为我们提供了View和V…