文档章节

Direct2D (24) : 合并几何对象

涂孟超
 涂孟超
发布于 2014/09/26 15:34
字数 330
阅读 10
收藏 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
博文 2011
码字总数 14107
作品 0
深圳
程序员
Direct2D教程(十)绘制文本

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

吞吞吐吐的
2017/10/17
0
0
杂谈SharpDx中的WIC组件——我们需要WIC的图片编码功能么?

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

万仓一黍
2013/10/08
0
0
Direct2D教程(十一)几何变换

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

吞吞吐吐的
2017/09/12
0
0
postgis常用函数(99%转载 1%原创)

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

威武不能笑
2013/01/07
0
0
PostgreSQL+PostGIS 的使用

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

技术mix呢
2017/11/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSX | SafariBookmarksSyncAgent意外退出解决方法

1. 启动系统, 按住⌘-R不松手2. 在实用工具(Utilities)下打开终端,输入csrutil disable, 然后回车; 你就看到提示系统完整性保护(SIP: System Integrity Protection)已禁用3. 输入reboot回车...

云迹
今天
4
0
面向对象类之间的关系

面向对象类之间的关系:is-a、has-a、use-a is-a关系也叫继承或泛化,比如大雁和鸟类之间的关系就是继承。 has-a关系称为关联关系,例如企鹅在气候寒冷的地方生活,“企鹅”和“气候”就是关...

gackey
今天
4
0
读书(附电子书)|小狗钱钱之白色的拉布拉多

关注公众号,在公众号中回复“小狗钱钱”可免费获得电子书。 一、背景 之前写了一篇文章 《小狗钱钱》 理财小白应该读的一本书,那时候我才看那本书,现在看了一大半了,发现这本书确实不错,...

tiankonguse
今天
4
0
Permissions 0777 for ‘***’ are too open

异常显示: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY FILE! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ......

李玉长
今天
5
0
区块链10年了,还未落地,它失败了吗?

导读 几乎每个人,甚至是对通证持怀疑态度的人,都对区块链的技术有积极的看法,因为它有可能改变世界。然而,区块链技术问世已经10年了,我们仍然没有真正的用上区块链技术。 几乎每个人,甚...

问题终结者
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部