Direct2D教程(六)图形也能做运算

简介:

概述

大家都学过集合运算,给定两个集合,可以求他们的并集,交集,差集等。其实图形之间也能做运算,今天就带大家开始图形运算之旅,讲讲如何合并图形。在D2D中有四种方法合并图形,分别是并(UNION),交(INTERSECT),差(EXCLUDE)和异或(XOR)。那么图形之间是如何合并的呢?两个图形之间进行Xor的结果是什么呢?为了便于理解,我先把效果图贴上来。下面图片中第一副图示两个圆的原始图,第二副图是UNION的结果,取两个圆所有的部分,但是公共部分只保留一份。第三幅图是INTERSECT的结果,取两个圆的公共部分。第四幅图是XOR的结果,取两个圆公共部分以外的部分。最后一幅图是EXCLUDE的结果,这个相当于集合的减法运算,在一个圆中去除两个圆的公共部分。

合并图形的基本步骤

图形的合并要经历以下几个步骤,合并后的图形是存放在path geometry中的。

  • 创建待合并的图形
  • 创建path geometry
  • 获取path geometry中的sink对象
  • 调用CombineWithGeometry函数进行合并

下面以UNION操作为例,详细演示如何合并图形。首先声明几个变量,pPathGeometryUnion用来存放合并后的图形,pCircleGeometry1和pCircleGeometry2表示待合并的两个圆。

ID2D1PathGeometry *  pPathGeometryUnion  =  NULL ;
ID2D1EllipseGeometry
*  pCircleGeometry1  =  NULL ;
ID2D1EllipseGeometry
*  pCircleGeometry2  =  NULL ;

 创建待合并的图形

这里创建两个圆,半径都是50.0f,一个圆心在(75.0f, 75.0f),另一个圆心在(125.0f, 75.0f),也就是说这两个圆是相交的。对应上面图片中第一副图。

复制代码
//  第一个圆
const  D2D1_ELLIPSE circle1  =  D2D1::Ellipse(
    D2D1::Point2F(
75.0f ,  75.0f ),
    50.0f ,
    50.0f
) ;

pD2DFactory -> CreateEllipseGeometry(
    & circle1,
    & pCircleGeometry1
) ;

//  第二个圆
const  D2D1_ELLIPSE circle2  =  D2D1::Ellipse(
    D2D1::Point2F(
125.0f ,  75.0f ),
    50.0f ,
    50.0f
) ;

pD2DFactory -> CreateEllipseGeometry(
    & circle2,
    & pCircleGeometry2
) ;
复制代码

创建path geometry

hr  =  pD2DFactory -> CreatePathGeometry( & pPathGeometryUnion) ;

获取path geometry的sink对象

if (SUCCEEDED(hr))
{
    ID2D1GeometrySink 
* pGeometrySink  =  NULL;
    hr 
=  pPathGeometryUnion -> Open( & pGeometrySink) ;
}

调用CombineWithGeometry进行合并

CombineWithGeometry是ID2D1SimplifiedGeometrySink接口里面的一个函数,所以任何类型的geometry都可以进行合并操作,合并的方式就是一个图形调用这个函数,将另一个图形作为参数传进去,比如要合并A和B两个图形,调用方法就是A->CombineWithGeometry(B, ...)。看一下这个函数的定义。

HRESULT CombineWithGeometry(
    [
in ] ID2D1Geometry  * inputGeometry,
    D2D1_COMBINE_MODE combineMode,
    [
ref ]  const  D2D1_MATRIX_3X2_F  & inputGeometryTransform,
    [
in ] ID2D1SimplifiedGeometrySink  * geometrySink
) 
const ;

第一个参数是待合并的图形,相当于上面例子中的B,第二个参数是合并的方式,目前有下面四种。

  • D2D1_COMBINE_MODE_UNION (并-两个图形的所有部分)
  • D2D1_COMBINE_MODE_INTERSECT (交-两个图形的公共部分)
  • D2D1_COMBINE_MODE_XOR (异或-两个图形的所有部分,但公共部分除外)
  • D2D1_COMBINE_MODE_EXCLUDE (差-属于一个图形而不属于另外一个图形的部分)

第三个参数是一个变换矩阵,可以在合并之前对参数一进行一些变换。最后一个参数是path geometry的sink对象,用来接收合并后的图形。调用代码如下,这里我们选择UNION合并方式,合并前不做任何变换,所以第三个参数传入NULL。

复制代码
hr  =  pPathGeometryUnion -> Open( & pGeometrySink) ;
if (SUCCEEDED(hr))
{
    hr 
=  pCircleGeometry1 -> CombineWithGeometry(
        pCircleGeometry2,
        D2D1_COMBINE_MODE_UNION,
        NULL,
        pGeometrySink
    ) ;
}
复制代码

绘制

由于图形已经合并,并且合并的结果已经存放到path geometry中,所以直接调用对应的path geometry即可进行绘制,也就是上面的pPathGeometryUnion。

pRenderTarget -> SetTransform(D2D1::Matrix3x2F::Translation( 100 ,  100 ));
pRenderTarget
-> DrawGeometry(pPathGeometryUnion, pBlackBrush) ;
pRenderTarget
-> FillGeometry(pPathGeometryUnion, pFillBrush) ;

总结

学习Direct2D已经有两个月的时间了,断断续续,现在的学习还比较浅,主要停留在如何使用API层面上,在随后的系列中,我会逐渐加入一些Demo,把相关的知识点整合到一起,这样也能一些整体的认识,对各种资源之间的协调有更深刻的认识。另外,这一篇也是Geometry系列的最后一篇,从下一篇开始学习(Brush)画刷。这是我第一次认真的写一个系列,以前曾经多次尝试,但都是有始无终,这次我想坚持下去,所以希望大家多多给我提意见,我一直觉得写一篇通俗易懂的文章绝非易事,我也经常把以前写过的文章从新拿出来重新审视并作些修改。因为一个技术点,你自己明白了,不一定能给别人讲明白,所以无论是什么意见,技术上的,写作技巧上的,或者其他方面的,越多越好!


本文转自zdd博客园博客,原文链接:http://www.cnblogs.com/graphics/archive/2011/06/01/2060480.html,如需转载请自行联系原作者

相关文章
|
JSON 小程序 JavaScript
【微信小程序】-- 自定义组件 -- 创建与引用 &样式(三十二)
【微信小程序】-- 自定义组件 -- 创建与引用 &样式(三十二)
|
前端开发 Java 关系型数据库
Caché学习笔记(一、cache安装与配置)
Caché学习笔记(一、cache安装与配置)
1865 0
Caché学习笔记(一、cache安装与配置)
|
2月前
|
人工智能 安全 IDE
公司不给你配 AI,你会自己掏钱吗?
AI正成为新时代的“办公软件”,开发者每月自费数百元订阅Claude、Cursor、Copilot等工具,实为工作刚需。公司尚未建立报销机制,但先行投入者已悄然积累不可替代的AI能力——这并非倒贴,而是抢占效率高地的聪明投资。
306 0
公司不给你配 AI,你会自己掏钱吗?
|
3月前
|
人工智能 运维 供应链
AI算力爆发,液冷CDU成刚需!核心原理、成本拆解、头部玩家全盘点
本文深度解析液冷CDU行业:随GB200/Rubin集群落地,单柜功耗超100kW,液冷成智算中心刚需。CDU作为液冷“心脏”,技术壁垒高、供需缺口大。全面梳理英维克、申菱等国产龙头及Vertiv等海外巨头的核心技术、客户生态与差异化优势,助力IDC与算力建设方决策。(239字)
|
4月前
|
存储 人工智能 安全
数据安全建设3大核心概念:脱敏、匿名化、去标识化一文讲清区别
本文厘清数据脱敏、匿名化、去标识化三大高频概念:脱敏重在“可用与安全平衡”,适用于开发测试等场景;匿名化追求“无法识别”,用于公开共享与统计分析;去标识化实现“受控可关联”,支撑跨系统合规流转。三者目标、能力与适用场景各异,混用易致安全失效。
|
6月前
|
人工智能 自然语言处理 搜索推荐
知识蒸馏(KD)深度落地:解锁GEO生成式优化轻量化高性能方案
知识蒸馏作为大模型轻量化的核心底层技术,有效解决了大模型落地贵、运行慢、部署难的痛点,让轻量化模型也能具备接近大模型的搜索语义理解与高质量内容生成能力。
|
7月前
|
机器学习/深度学习 存储 数据可视化
一键对接阿里百炼大模型,MaixinVoiceAI 3.0打造超拟人企业级智能呼叫中心
在大模型浪潮下,阿里百炼×MaixinVoiceAI 3.0重塑大模型智能呼叫中心:95%+语音识别率、自然多轮对话、零代码三步对接,5分钟上线。支持电话智能体(80%需求自动化)与座席助手双引擎,降本40%+,提升满意度,已落地金融、政务、医疗等十大行业。
|
6月前
|
缓存 人工智能 运维
大模型落地生产环境,Claude 4.6 成本失控前必须做的架构调整
大模型落地后,高昂API成本成最大瓶颈。本文提出三大降本动作:1)严控Token消耗与生命周期,善用Prompt缓存;2)实施模型分层路由,按需调用Opus/Sonnet/Haiku;3)引入聚合网关,统一接入、自动容灾、对公结算。早治理,早见效。
561 0
大模型落地生产环境,Claude 4.6 成本失控前必须做的架构调整
|
8月前
|
网络安全 文件存储 开发工具
飞牛NAS笔记本盒盖不休眠
笔记本装飞牛NAS(fnOS)后,合盖即休眠导致服务中断?本文详解如何通过修改`/etc/systemd/logind.conf`中`HandleLidSwitch*`参数为`ignore`,并重启`systemd-logind`,实现合盖不休眠——Web、Docker、下载全正常运行。安全、有效、一步到位!
1152 4

热门文章

最新文章