文档章节

Direct2D (24) : 合并几何对象

涂孟超
 涂孟超
发布于 2014/09/26 15:34
字数 330
阅读 12
收藏 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 绘制分层窗口

这是我关于Direct2D的第三篇介绍了,今天主要讲下其无可比拟的互操作性。为了避免繁缛末节的讲述,我们从一个实例入手:层级窗口。相对于windows的其它众多功能。层级窗口并未做相应的更新,...

Dy_
2014/01/16
8.2K
10
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

没有更多内容

加载失败,请刷新页面

加载更多

Kafka+Flink 实现准实时异常检测系统

1.背景介绍 异常检测可以定义为“基于行动者(人或机器)的行为是否正常作出决策”,这项技术可以应用于非常多的行业中,比如金融场景中做交易检测、贷款检测;工业场景中做生产线预警;安防...

架构师springboot
15分钟前
1
0
DecimalFormat 类基本使用

/* * DecimalFormat 类主要靠 # 和 0 两种占位符号来指定数字长度 * 0 表示如果位数不足则以 0 填充 * # 表示只要有可能就把数字拉上这个位置 * */ public static void main(String[] args){...

嘴角轻扬30
32分钟前
3
0
This APT has Super Cow Powers.

在Debian/Ubuntu上,apt包管理器内嵌着一个彩蛋. 如果你在命令行界面输入 apt help 在最后一行能找到This APT has Super Cow Powers. 说明该apt具有超级牛力 牛力是个什么梗? 则说明你的系统...

taadis
49分钟前
2
0
起薪2万的爬虫工程师,Python需要学到什么程度才可以就业?

爬虫工程师的的薪资为20K起,当然,因为大数据,薪资也将一路上扬。那么,Python需要学到什么程度呢?今天我们来看看3位前辈的回答。 1、前段时间快要毕业,而我又不想找自己的老本行Java开发...

糖宝lsh
58分钟前
6
0
携手开发者共建云生态 首届腾讯云+社区开发者大会在京举办

本文由云+社区发表 北京时间12月15日,由腾讯云主办,极客邦科技、微信、腾讯TEG协办的首届腾讯云+社区开发者大会在北京朝阳悠唐皇冠假日酒店举办。在会上,腾讯云发布了重磅产品开发者平台以...

腾讯云加社区
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部