十二,几何图形和图画

  1. Path类是功能最强大的形状类,它能够包含任何简单形状、多级形状及更更复杂的曲线。Path.Data属性,该属性接受一个Geometry对象,该对象定义路径包含的一个或多个图形,Geometry是一个抽象类,指定Data时需要使用以下Geometry类的派生类:

    路径和几何图形之间的区别:几何图形定义形状,而路径用于绘制形状,因此,Geometry对象为形状定义了坐标、尺寸等细节,而Path对象提供了绘制形状所使用的Stroke和Fill画刷,Path类还继承自UIElement基础架构中的特性,如鼠标和键盘处理。
    Geometry继承自Freezable类,所以它的派生类都支持更改通知,因此,如果使用几何图形创建了一个路径,然后修改该几何图形,路径就会被重新绘制。

    1. LineGeometryRectangleGeometryEllipseGeometry几何形状直接和Line、Rectangle、Ellipse形状对应。如下标记分别将Rectangle、Line和Ellipse形状转换为Path元素的标记:    

      <Rectangle Width="80" Height="50" Fill="Red" Stroke="Yellow" RadiusX="10" RadiusY="10"></Rectangle>
      <Path Fill="Red" Stroke="Yellow" Canvas.Top="55">
          <Path.Data>
              <RectangleGeometry Rect="0,0,80,50" RadiusX="10" RadiusY="10"></RectangleGeometry>
          </Path.Data>
      </Path>
      <Line Stroke="Yellow" X2="80" Y2="120" Y1="120" StrokeThickness="5"></Line>
      <Path Stroke="Yellow" StrokeThickness="5">
          <Path.Data>
              <LineGeometry StartPoint="0,140" EndPoint="80,140"></LineGeometry>
          </Path.Data>
      </Path>
      <Ellipse Fill="Red" Stroke="Yellow" Width="80" Height="50" Canvas.Top="160"></Ellipse>
      <Path Fill="Red" Stroke="Yellow" Canvas.Top="215">
          <Path.Data>
              <EllipseGeometry RadiusX="40" RadiusY="25" Center="40,27"></EllipseGeometry>
          </Path.Data>
      </Path>

    2. 使用GeometryGroup来组合形状

      组合图形最简单的方法是使用GeometryGroup对象,该对象在内部嵌套其它Geometry类的派生类对象,如下示例是正方形旁边放了一个椭圆:

      <TextBlock Canvas.Top="338" FontSize="20" FontWeight="Bold" Canvas.Left="64">GeometryGroup Test</TextBlock>
      <Path Fill="Red" Stroke="Blue" Canvas.Top="300">
          <Path.Data>
              <GeometryGroup>
                  <RectangleGeometry Rect="0 0 100 100"></RectangleGeometry>
                  <EllipseGeometry Center="100 50" RadiusX="40" RadiusY="50"></EllipseGeometry>
              </GeometryGroup>
          </Path.Data>
      </Path> 

      上面的标记的效果和使用两个Path元素的效果相同,但这有一个优点:使用数量更少的较复杂几何图形元素的窗口比具有大量较简单几何图形元素的窗口的性能要高。在只有几十个形状的窗口中这一效果并不明显,但对于需要几百或几千个形状的窗口,这一问题就会变得很明显。 
      当形状相互重叠时,GeometryGroup不是将每个形状简单的进行组合,它使用FillRule属性决定填充区域,并且在GeometryGroup中,椭圆被看作为一个洞,而不是具有不同填充的其他形状,后面的任何内容都可以透过该洞显示。 
      GeometryGroup的另一个优点是可以使用它定义资源,如下所示:

      <Window.Resources>
          <GeometryGroupx:Key="Geometry">
              <RectangleGeometryRect="0 0 100 100"></RectangleGeometry>
              <EllipseGeometryCenter="100 50" RadiusX="40" RadiusY="50"></EllipseGeometry>
          </GeometryGroup>
      </Window.Resources> 
      
      <PathFill="Azure" Stroke="Black" Data="{StaticResource Geometry}" Canvas.Left="148.807" Canvas.Top="5"></Path>
      <PathFill="Green" Stroke="Beige" Data="{StaticResource Geometry}" Canvas.Left="149" Canvas.Top="120.408"></Path> 

    3. 使用CombinedGeometry融合几何图形

      CombinedGeometry类专门用于组合重叠到一起的形状,与GeometryGroup不同,它只通过Geometry1Geometry2属性提供两个几何图形,它没有包含FillRule属性,而是包含了功能更加强大的GeometryCombineMode属性,它有四种取值:UnionIntersectXorExclude,用于分别求两个形状的并集、交集、异或集、差集。

      虽然CombinedGeometry只能提供两个几何图形进行组合,但是可以通过嵌套CombinedGeometry的方式组合任意复杂的几何图形。

      当为几何图形应用变换时,使用Transform,而不是RenderTransform或LayoutTransform,这是因为几何图形定义了形状,并且所有的变换总是在布局中使用路径之前被引用。

       

      <Path Fill="Red" Stroke="Blue" Canvas.Left="100.679" Canvas.Top="24.99">
          <Path.Data>
              <CombinedGeometry>
                  <CombinedGeometry.Geometry1>
                      <CombinedGeometry GeometryCombineMode="Exclude">
                          <CombinedGeometry.Geometry1>
                              <EllipseGeometry RadiusX="70" RadiusY="70" Center="70,70"></EllipseGeometry>
                          </CombinedGeometry.Geometry1>
                          <CombinedGeometry.Geometry2>
                              <EllipseGeometry RadiusX="50" RadiusY="50" Center="70,70"></EllipseGeometry>
                          </CombinedGeometry.Geometry2>
                      </CombinedGeometry>
                  </CombinedGeometry.Geometry1>
                  <CombinedGeometry.Geometry2>
                      <RectangleGeometry Rect="5 60 130 20">
                          <RectangleGeometry.Transform>
                              <RotateTransform CenterX="70" CenterY="70" Angle="-45"></RotateTransform>
                          </RectangleGeometry.Transform>
                      </RectangleGeometry>
                  </CombinedGeometry.Geometry2>
              </CombinedGeometry>
          </Path.Data>
      </Path>

    4. 使用PathGeometry绘制直线和曲线

      PathGeometry是功能最强大的图形,它能够绘制其他所有几何图形能够绘制的内容,并且也能够绘制其他所有几何图形所不能绘制的内容,它的唯一缺点就是语法比较长且更复杂。

      每个PathGeometry对象都是由一个或多个PathFigure对象构建的(存储在PathGeometry.Figures集合中),每个PathFigure对象又是由一系列继承自PathSegment类的线段绘制的形状,下面列出了这些线段类:

      1. LineSegment 直线

        使用LineSegment和PathGeometry类创建简单的线条非常容易,只需要设置StartPoint,并为线条中的每部分增加一条LineSegment直线段,LineSegment.Point标识每条线段的结束点。

                 

        <Path Fill="Red" Stroke="Black" Canvas.Left="262.144" Canvas.Top="22">
            <Path.Data>
                <PathGeometry>
                    <PathFigure StartPoint="10,100" IsClosed="True">
                        <LineSegment Point="100,100"/>
                        <LineSegment Point="100,20"/>
                    </PathFigure>
                    <PathFigure IsClosed="True">
                        <LineSegment Point="90,0"/>
                        <LineSegment Point="0,80"/>
                    </PathFigure>
                </PathGeometry>
            </Path.Data>
        </Path> 

      2. ArcSegment 弧线

        弧线实际上是椭圆边缘的一部分,使用PathFigure.StartPoint指定起点,使用ArcSegment.Point指定终点,在两点之间绘制一条曲线。使用Size属性指定椭圆的尺寸。

        IsLargeArc属性:用来设置弧线取自椭圆的哪一部分,默认是false,也就是默认取椭圆上最短的弧线。

        SweepDirection属性:该属性可以是Counterclockwise(逆时针,默认值)或Clockwise。它指定了以两点定义椭圆时的方向。

        <Path Fill="Red" Stroke="Black" Canvas.Left="399" Canvas.Top="72">
            <Path.Data>
                <PathGeometry>
                    <PathFigure StartPoint="0,50">
                        <ArcSegment Point="100,50" Size="60,60" IsLargeArc="True" SweepDirection="Clockwise"/>
                    </PathFigure>
                </PathGeometry>
            </Path.Data>
        </Path>

时间: 2024-11-03 05:33:23

十二,几何图形和图画的相关文章

SQL Server 2008空间数据应用系列十二:Bing Maps中呈现GeoRSS订阅的空间数据

原文:SQL Server 2008空间数据应用系列十二:Bing Maps中呈现GeoRSS订阅的空间数据 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. 2.具备 Transact-SQL 编程经验和使用 SQL Server Management Studio 的经验. 3.熟悉或了解Microsoft SQL Server 2008中的空间数据类型. 4.具备相应(比如OGC规范.KML规范)的GIS专业理论知识.

ng机器学习视频笔记(十二) ——PCA实现样本特征降维

ng机器学习视频笔记(十二) --PCA实现样本特征降维 (转载请附上本文链接--linhxx) 一.概述 所谓降维(dimensionality reduction),即降低样本的特征的数量,例如样本有10个特征值,要降维成5个特征值,即通过一些方法,把样本的10个特征值映射换算成5个特征值. 因此,降维是对输入的样本数据进行处理的,并没有对预测.分类的结果进行处理. 降维的最常用的方法叫做主成分分析(PCA,principal component analysis).最常用的业务场景是数据压

201771010111 李瑞红 《第十二周学习总结》

实验十二  图形程序设计 实验时间 2018-11-14 第一部分:理论知识总结 1.Java的抽象口工具箱( Abstract WindowToolkit, AWT)包含在java.awt包中,它提供了许多用来设计GUI的组件类和容器类. 2.AWT库处理用户界面元素的方法:把图形元素的创建和行为委托给本地GUI工具箱进行处理. 3.Swing用户界面库是非基于对等体的GUI工具箱.Swing具有更丰富并且更方便的用户界面元素集合.Swing对底层平台的依赖很少,因此与平台相关的bug很少.S

从零开始学习PYTHON3讲义(十二)画一颗心送给你

(内容需要,本讲使用了大量在线公式,如果因为转帖网站不支持公式无法显示的情况,欢迎访问原始博客.) <从零开始PYTHON3>第十二讲 上一节课我们主要讲解了数值计算和符号计算.数值计算的结果,很常用的目的之一就是用于绘制图像,从图像中寻找公式的更多内在规律. Python科学绘图 科学绘图是计算机图形学的一个重要分支.同其它绘图方式相比,更简单易用,能让使用者把工作的主要精力集注在公式和算法上而不是绘图本身.此外科学绘图的工具包普遍精度更高,数据.图的对应关系准确,从而保证基于图的研究工作顺

42. 蛤蟆的数据结构笔记之四十二图的遍历之广度优先

42. 蛤蟆的数据结构笔记之四十二图的遍历之广度优先 本篇名言:"生活真象这杯浓酒 ,不经三番五次的提炼呵 , 就不会这样一来可口 ! -- 郭小川" 继续看下广度优先的遍历,上篇我们看了深度遍历是每次一个节点的链表是走到底的. 欢迎转载,转载请标明出处:http://write.blog.csdn.net/postedit/47029275 1.  原理 首先,从图的某个顶点v0出发,访问了v0之后,依次访问与v0相邻的未被访问的顶点,然后分别从这些顶点出发,广度优先遍历,直至所有的

C和指针 (pointers on C)——第十二章:使用结构和指针

第十二章 使用结构和指针 这章就是链表.先单链表,后双向链表. 总结: 单链表是一种使用指针来存储值的数据结构.链表中的每个节点包含一个字段,用于指向链表的下一个节点. 有一个独立的根指针指向链表的第1个节点.单链表只能从一个方向遍历. 如何insert单链表:1.新节点的link字段必须设置为指向它的后面节点.2.前一个节点的link字段必须指向这个新节点. 为了防止可能会插入链表的起始位置这种情况,在C中,可以保存一个指向必须进行修改的link字段的指针,而不是保存一个指向前一个节点的指针.

微软云计算介绍与实践(实践之十二)

今天主要实践使用远程 SMB 存储共享保存 VHD.由于周末要看球等原因,内容不多,有料就行.(^_^) 接前面,公司私有云管理员小张已经执行了迁移,他还需要在最近已部署的 Virtual Machine Manager 环境中检查虚拟机设置.所以下一步小张需要确认 Guest01 的存储已经位于 HyperV02 上的 SMB 3.0 共享中,并且虚拟机通过 EvalCluster 群集运行. 1.打开 Virtual Machine Management 控制台,输入用户名 CONTOSO\

【管理心得之二十二】小人物 仰视 大授权

场景再现====================Boss:小王,来我办公室一下.小王: 嗯Boss:近期总公司有会,需要到外地出差几日.我不在的这段期间里,公司大小事务你帮忙处理一下.          如果有什么难决定的事,第一时间电话.邮件联系我商定即可.小王:  明白.放心吧领导,绝不会让你失望的Boss:嗯,那就好,没事了. {小王走出办公室} 心中暗喜,"难道这就是传说中的授权,Boss不在的时候,我岂不是最高权力的行使者." ==================== 从场景

QT开发(二十二)——QMainWindow主窗口

QT开发(二十二)--QMainWindow主窗口 一.主窗口简介 应用程序中的主窗口是与用户进行长时间交互的顶层窗口,提供了应用程序的大部分功能,通常是应用程序启动后的第一个窗口,应用程序一般由一个主窗口和多个对话框组成. QT中直接支持主窗口,QMainWindow是QT中主窗口的基类,是继承于QWidget类的容器型组件. QMainWindow内部封装了菜单栏.工具栏.中心组件.停靠组件.状态栏等. QMainWindow内置了布局管理器,基本的组件布局如下: 二.菜单栏 QT中提供了预

《构建之法》第十一、十二章学习总结

第十一章的内容是软件设计与实现. 在第一节中,讲的是关于分析和设计方法,向我们介绍在"需求分析"."设计与实现"阶段."测试""发布"阶段该搞清楚的问题. 在第二节中,讲的是关于图形建模和分析方法.在表达实体和实体之间的关系时,可以用到思维导图(Mind Map).实体关系图(ERD).UCD ;在表达数据的流动时,可以用到DFD工具:在表达控制流的时候可以用到FSM工具:前面提到的这些图形建模方法各有特点,UML却可以有一个