文档章节

Direct2D (24) : 合并几何对象

涂孟超
 涂孟超
发布于 2014/09/26 15:34
字数 330
阅读 9
收藏 0
点赞 0
评论 0

合并通过 ID2D1Geometry.CombineWithGeometry() 完成,但返回的是 ID2D1SimplifiedGeometrySink(ID2D1GeometrySink 的父对象);
需要把 ID2D1SimplifiedGeometrySink 添加到 ID2D1PathGeometry 才能使用。

uses Direct2D, D2D1;

procedure TForm1.FormPaint(Sender: TObject);
var
  cvs: TDirect2DCanvas;
  iEllipseGeometry1, iEllipseGeometry2: ID2D1EllipseGeometry;
  iGeometrySink: ID2D1GeometrySink;
  iPathGeometry1,iPathGeometry2,iPathGeometry3,iPathGeometry4: ID2D1PathGeometry;
  ptCenter: TD2DPoint2f;
  r: Single;
  matrix: TD2DMatrix3x2F;
begin
  ptCenter := D2D1PointF(100, 100);
  r := 50;
  matrix := TD2DMatrix3x2F.Identity;

  {两个源对象}
  D2DFactory.CreateEllipseGeometry(D2D1Ellipse(ptCenter, r, r), iEllipseGeometry1);
  ptCenter.x := ptCenter.x + r;
  D2DFactory.CreateEllipseGeometry(D2D1Ellipse(ptCenter, r, r), iEllipseGeometry2);

  {UNION 运算}
  D2DFactory.CreatePathGeometry(iPathGeometry1);
  iPathGeometry1.Open(iGeometrySink);
    iEllipseGeometry1.CombineWithGeometry(iEllipseGeometry2, D2D1_COMBINE_MODE_UNION, matrix, 0, iGeometrySink);
  iGeometrySink.Close;

  {INTERSECT 运算}
  D2DFactory.CreatePathGeometry(iPathGeometry2);
  iPathGeometry2.Open(iGeometrySink);
    iEllipseGeometry1.CombineWithGeometry(iEllipseGeometry2, D2D1_COMBINE_MODE_INTERSECT, matrix, 0, iGeometrySink);
  iGeometrySink.Close;

  {XOR 运算}
  D2DFactory.CreatePathGeometry(iPathGeometry3);
  iPathGeometry3.Open(iGeometrySink);
    iEllipseGeometry1.CombineWithGeometry(iEllipseGeometry2, D2D1_COMBINE_MODE_XOR, matrix, 0, iGeometrySink);
  iGeometrySink.Close;

  {EXCLUDE 运算}
  D2DFactory.CreatePathGeometry(iPathGeometry4);
  iPathGeometry4.Open(iGeometrySink);
    iEllipseGeometry1.CombineWithGeometry(iEllipseGeometry2, D2D1_COMBINE_MODE_EXCLUDE, matrix, 0, iGeometrySink);
  iGeometrySink.Close;

  cvs := TDirect2DCanvas.Create(Canvas, ClientRect);
  cvs.BeginDraw;
  cvs.Pen.Color := clWebCornFlowerBlue;
  cvs.Brush.Color := clWebCornFlowerBlue;
  cvs.Brush.Handle.SetOpacity(0.75);

  cvs.FillGeometry(iPathGeometry1);
  cvs.DrawGeometry(iEllipseGeometry1);
  cvs.DrawGeometry(iEllipseGeometry2);

  cvs.RenderTarget.SetTransform(TD2DMatrix3x2F.Translation(180, 0));
  cvs.FillGeometry(iPathGeometry2);
  cvs.DrawGeometry(iEllipseGeometry1);
  cvs.DrawGeometry(iEllipseGeometry2);

  cvs.RenderTarget.SetTransform(TD2DMatrix3x2F.Translation(180*2, 0));
  cvs.FillGeometry(iPathGeometry3);
  cvs.DrawGeometry(iEllipseGeometry1);
  cvs.DrawGeometry(iEllipseGeometry2);

  cvs.RenderTarget.SetTransform(TD2DMatrix3x2F.Translation(180*3, 0));
  cvs.FillGeometry(iPathGeometry4);
  cvs.DrawGeometry(iEllipseGeometry1);
  cvs.DrawGeometry(iEllipseGeometry2);

  cvs.EndDraw;
  cvs.Free;
end;


效果图:



简化后的代码:

uses Direct2D, D2D1;

procedure TForm1.FormPaint(Sender: TObject);
var
  cvs: TDirect2DCanvas;
  iEllipseGeometry1, iEllipseGeometry2: ID2D1EllipseGeometry;
  iGeometrySink: ID2D1GeometrySink;
  iPathGeometrys: array[0..3] of ID2D1PathGeometry;
  ptCenter: TD2DPoint2f;
  r: Single;
  i: Integer;
begin
  ptCenter := D2D1PointF(100, 100);
  r := 50;

  D2DFactory.CreateEllipseGeometry(D2D1Ellipse(ptCenter, r, r), iEllipseGeometry1);
  ptCenter.x := ptCenter.x + r;
  D2DFactory.CreateEllipseGeometry(D2D1Ellipse(ptCenter, r, r), iEllipseGeometry2);

  for i := 0 to 3 do
  begin
    D2DFactory.CreatePathGeometry(iPathGeometrys[i]);
    iPathGeometrys[i].Open(iGeometrySink);
      iEllipseGeometry1.CombineWithGeometry(iEllipseGeometry2, i, TD2DMatrix3x2F.Identity, 0, iGeometrySink);
    iGeometrySink.Close;
  end;

  cvs := TDirect2DCanvas.Create(Canvas, ClientRect);
  cvs.BeginDraw;
  cvs.Pen.Color := clWebCornFlowerBlue;
  cvs.Brush.Color := clWebCornFlowerBlue;
  cvs.Brush.Handle.SetOpacity(0.75);

  for i := 0 to 3 do
  begin
    cvs.RenderTarget.SetTransform(TD2DMatrix3x2F.Translation(180*i, 0));
    cvs.FillGeometry(iPathGeometrys[i]);
    cvs.DrawGeometry(iEllipseGeometry1);
    cvs.DrawGeometry(iEllipseGeometry2);
  end;

  cvs.EndDraw;
  cvs.Free;
end;


本文转载自:http://www.cnblogs.com/del/archive/2011/04/06/2007185.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2004
码字总数 14107
作品 0
深圳
程序员
Direct2D教程(十)绘制文本

概述 在Direct2D中,文本的绘制是通过DirectWrite来实现的,DirectWrite实际上已经是一个独立的DirectX组件了。关于DirectWrite,我摘录了MSDN的一段文字。 DirectWrite介绍 当今的应用程序应...

吞吞吐吐的 ⋅ 2017/10/17 ⋅ 0

杂谈SharpDx中的WIC组件——我们需要WIC的图片编码功能么?

在前文 SharpDX之Direct2D教程II——加载位图文件和保存位图文件 中,发现在VB2010中不能很好的运用SharpDx中的WIC组件进行图片的编码工作。可能是我的设置问题,也可能是SharpDx对VB2010支持...

万仓一黍 ⋅ 2013/10/08 ⋅ 0

Direct2D教程(十一)几何变换

什么是几何变换(Transform) 在图形学中,主要有三种几何变换,分别是平移(Translate),旋转(Rotation)和缩放(Scaling)。在D2D中,这三种变换都有实现,而且还有一种不太常见的变换,...

吞吞吐吐的 ⋅ 2017/09/12 ⋅ 0

postgis常用函数(99%转载 1%原创)

1,基本操作函数 AddGeometryColumn(<schemaname>, <tablename>, <columnname>, <srid>, <type>, <dimension>) 给一个已存在属性数据表增加一个几何字段(geomtry column)。schemaname 指表的模......

威武不能笑 ⋅ 2013/01/07 ⋅ 0

PostgreSQL+PostGIS 的使用

阅读目录 一、PostGIS中的几何类型 二、 PostGIS中空间信息处理的实现 三、 PostGIS中的常用函数 四、 PostGIS示例 回到顶部 一、PostGIS中的几何类型 PostGIS支持所有OGC规范的“Simple Fe...

技术mix呢 ⋅ 2017/11/07 ⋅ 0

Direct2D教程(十二)图层

什么是Layers? Layer,中文译成图层,在Direct2D中可以用来完成一些特殊效果,使用Layer的时候,先将Layer Push到render target,然后进行绘制,此时是直接绘制在Layer上的,绘制完毕后,将...

吞吞吐吐的 ⋅ 2017/10/26 ⋅ 0

WhiteStarUML 5.6.3 发布,UML 建模工具

WhiteStarUML 5.6.3 发布,主要改进如下: 现在滚动启用了 Direct2D 的图像会有更好性能(之前会有明显的卡顿感) 基于现有stereotype 选择已标记值的操作应该更加容易 现在通过 Rational 扩...

daxiaoming ⋅ 2015/04/25 ⋅ 6

使用几何画板时如何合并多个画板文件

在使用几何画板的时候,一些用户需要打开多个画板文件,在这种情况下如果需要使用其中某个画板文件时,寻找起来可能不是一件简单的事。面对这种情况,我们可以将多个画板文件合并,需要时点击...

学术研究软件 ⋅ 2016/04/08 ⋅ 0

如何让几何画板中点与点的坐标一起移动

几何画板是一款非常受老师所青睐的教程软件,很多在黑板上无法实现的效果都可以在几何画板里实现,让老师的课程变得更加有趣。在使用过程中很多的用户朋友会遇到各种问题,这个时候就需要了解...

学术研究软件 ⋅ 2016/06/03 ⋅ 0

关于Direct3D11里汉字显示的一些思考

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。 http://blog.csdn.net/zhmxy555/article/details/8147234 作者:毛星云 邮箱: happylifemxy@163.com 这篇文章里,浅墨希望与大家一起...

长平狐 ⋅ 2012/11/12 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

在java中读取文件(也支持读取jar中的文件)

getClass().getResourceAsStream("文件名.格式"); 这个方法是用于获取当前类所在目录下的文件;需要将文件放到和当前类同一个包下面 比如我有个类在 com.test这个包下, 要读取一个test.jpg的图...

太黑_thj ⋅ 54分钟前 ⋅ 0

CentOS 7 源码编译安装 MySQL 5.7记录

没事瞎折腾,本来可以yum安装,却偏偏去要编译源码。 1. 安装依赖包 1). 安装cmake等依赖 # yum install cmake ncurses ncurses-devel bison bison-devel 2). 安装boost 1.59.0 # wget htt...

admin_qing ⋅ 56分钟前 ⋅ 0

tcp/ip详解-链路层

简介 设计链路层的目的: 为IP模块发送和接收IP数据报 为ARP模块发送ARP请求和接收ARP应答 为RARP模块发送RARP请求和接收RARP应答 TCP/IP支持多种链路层协议,如以太网、令牌环往、FDDI、RS-...

loda0128 ⋅ 今天 ⋅ 0

spring.net aop代码例子

https://www.cnblogs.com/haogj/archive/2011/10/12/2207916.html

whoisliang ⋅ 今天 ⋅ 0

发送短信如何限制1小时内最多发送11条短信

发送短信如何限制1小时内最多发送11条短信 场景: 发送短信属于付费业务,有时为了防止短信攻击,需要限制发送短信的频率,例如在1个小时之内最多发送11条短信. 如何实现呢? 思路有两个 截至到当...

黄威 ⋅ 昨天 ⋅ 0

mysql5.7系列修改root默认密码

操作系统为centos7 64 1、修改 /etc/my.cnf,在 [mysqld] 小节下添加一行:skip-grant-tables=1 这一行配置让 mysqld 启动时不对密码进行验证 2、重启 mysqld 服务:systemctl restart mysql...

sskill ⋅ 昨天 ⋅ 0

Intellij IDEA神器常用技巧六-Debug详解

在调试代码的时候,你的项目得debug模式启动,也就是点那个绿色的甲虫启动服务器,然后,就可以在代码里面断点调试啦。下面不要在意,这个快捷键具体是啥,因为,这个keymap是可以自己配置的...

Mkeeper ⋅ 昨天 ⋅ 0

zip压缩工具、tar打包、打包并压缩

zip 支持压缩目录 1.在/tmp/目录下创建目录(study_zip)及文件 root@yolks1 study_zip]# !treetree 11└── 2 └── 3 └── test_zip.txt2 directories, 1 file 2.yum...

蛋黄Yolks ⋅ 昨天 ⋅ 0

聊聊HystrixThreadPool

序 本文主要研究一下HystrixThreadPool HystrixThreadPool hystrix-core-1.5.12-sources.jar!/com/netflix/hystrix/HystrixThreadPool.java /** * ThreadPool used to executed {@link Hys......

go4it ⋅ 昨天 ⋅ 0

容器之上传镜像到Docker hub

Docker hub在国内可以访问,首先要创建一个账号,这个后面会用到,我是用126邮箱注册的。 1. docker login List-1 Username不能使用你注册的邮箱,要用使用注册时用的username;要输入密码 ...

汉斯-冯-拉特 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部