文档章节

Direct2D处理几何图形之间的碰撞检测(上)

o
 osc_k11w4vu5
发布于 2019/05/06 11:11
字数 1723
阅读 15
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

原文: Direct2D处理几何图形之间的碰撞检测(上)

转载请注明出处:http://www.cnblogs.com/Ray1024

一、概述

Direct2D中支持以下几种类型的几何图形:

  a.简单几何图形(Simple Geometry):矩形、圆角矩形、椭圆;

  b.路径图形(Path Geometry);

  c.复合图形(Composite Geometry):图形组、变换图形。

 

最近发现D2D除了可以绘制不同类型的几何图形之外,还有一个很强大的功能:对几何图形进行关系判断(也就是我们常说的碰撞检测)。

这里首先介绍一个D2D的一个接口类ID2D1Geometry。它用来表示一个几何对象资源,并定义一组用于处理和测量几何形状的帮助器方法。从 ID2D1Geometry 继承的接口将定义特定形状。上面提到的所有图形类都是ID2D1Geometry的子类。

下面我们就介绍一下几何图形的碰撞检测。

 

二、几何图形与点的碰撞检测

1.函数介绍

这里首先要介绍ID2D1Geometry接口的两个成员函数FillContainsPoint和StrokeContainsPoint,这两个函数涉及到我们将要进行的几何图形和点的碰撞检测,(这两个函数都有4个重载,这里由于篇幅原因只分别介绍重载中的一个,其实原理都一样,其他的重载大家可以去msdn官网了解):

(1)ID2D1Geometry::FillContainsPoint函数介绍

  功能:指示由该几何对象填充的区域是否包含指定点。
  参数
    point               要测试的点。
    worldTransform    进行包含测试前应用到该几何对象的转换。
    contains              此方法返回时将包含一个布尔值,表示几何图形是否包含point。必须为此参数分配存储空间。
  返回值:如果该方法成功,返回 S_OK;否则,将返回错误代码。 

 

(2)ID2D1Geometry::StrokeContainsPoint函数介绍

  功能:确定几何对象的笔画是否包含指定的点。 

  参数     

    point               要测试的点。

    strokeWidth   要应用的笔画粗细。

    strokeStyle    要应用的笔画样式。

    worldTransform   进行包含测试前应用到该几何对象的转换。     

    contains              此方法返回时将包含一个布尔值,表示几何图形的笔画(边框)包含point。必须为此参数分配存储空间。

  返回值:如果该方法成功,返回 S_OK;否则,将返回错误代码。 

 

2.代码实现

接下来我们就可以使用这个函数进行几何图形和点的碰撞检测工作了。我在代码中封装了两个函数PtInGeometry和PtInGeometryBorder,分别用来判断"点是否在几何图形内"和"点是否在几何图形(画笔)边框上"。

// 检测点是否在几何图形内
bool PtInGeometry(ID2D1Geometry* pGeometry, D2D1_MATRIX_3X2_F& transMatrix, D2D1_POINT_2F& pt)
{
	BOOL contain = FALSE;
	HRESULT hr = S_OK;

	hr = pGeometry->FillContainsPoint( pt, &transMatrix, &contain);
	if (SUCCEEDED(hr) && contain)
	{
		return true;
	}

	return false;
}

 

// 检测点是否在几何图形边框上
bool PtInGeometryBorder(ID2D1Geometry* pGeometry, float strokeWidth, D2D1_MATRIX_3X2_F& transMatrix, D2D1_POINT_2F& pt)
{
	BOOL contain = FALSE;
	HRESULT hr = S_OK;

	hr = pGeometry->StrokeContainsPoint( pt, strokeWidth, NULL, &transMatrix, &contain);      
	if (SUCCEEDED(hr) && contain)
	{
		return true;
	}

	return false;
}

 

这样我们就可以确定点和几何图形之间的三种关系了:

  a.点在几何图形里面

  b.点在几何图形边框上

  c.点在几何图形外面

 

现在开始我们的测试,为了证明Direct2D可以判断任何几何图形和点的位置关系,使用一个五角星(路径几何图形)用当作检测的几何图形。这样做的想法是:既然复杂的路径几何图形都可以作这种判断,那么其他简单的几何图形当然也就没有任何问题啦!

在测试代码中,在窗口绘制的函数中绘制一个五角星(路径几何图形)用当作检测的几何图形,这里需要注意的是,为了让点和五角星之间的三种位置关系在演示效果中比较直观和明显,我将五角星填充色设置为银灰色;画两次边框(画笔),第一个边框(画笔)宽度设置为1,边框颜色设置为黑色;第二个边框(画笔)宽度设置为50,边框颜色设置为粉色并设为半透明。这样五角星的轮廓和边框就显而易见了,在黑色框内就是在五角星内,在粉色范围内就是在五角星边框上,在粉色边框外就是在五角星外。

之后绘制3个不同位置的点(注:由于Direct2D中没有直接绘制点的方法,使用边长为0的矩形代替点;为了我们的演示更清晰,这个边长为0的矩形绘制时画笔宽度为5,但是判断时仍然为点),在绘制点之前判断点和五角星的关系。如果点在五角星内部,绘制成红色;点在五角星边框上,绘制成紫色;点在五角星外面,绘制成绿色。这样在绘制结果中,我们就可以根据点的颜色来识别五角星和点的位置关系了。

最后贴一张测试Demo的效果图:

 

如上图中,三个点的位置和五角星之间的关系就一目了然了。

 

3.讨论

其实看到上面的演示图之后大家也能想到,其实点和几何图形的位置关系还有一种。这种比较特殊,就是在银灰色范围和粉色范围之间,有一个范围区域是银灰色和粉色叠加而成的深粉色(?感觉是这个颜色,怀疑自己是不是色弱...),这个区域就是我要说的第4种位置关系:既在五角星边框上,也在五角星内。如下图所示:

这是由于绘制边框的画笔是以边框为中心的,画笔的宽度不为0时,就会有一半的宽度覆盖到几何图形内,也就造成了这种特殊的位置关系。当然,如果几何图形在绘制时直接使用填充方式,而不绘制边框,那么我们就可以忽略这种特殊情况了。

还有一点需要注意的是,对五角星(几何对象)做变换之后,再和点作位置关系判断也是可以的。只是在我代码例子中,没有对五角星做变换。

 

在这里完整代码代码就不贴出了,有兴趣的朋友可以点击此处下载Demo源码,Demo源码是Direct2DTests目录下的D2DGeometryCollisionDetectionWithPt文件。

 

三、结语

几何图形与点的碰撞检测到这里就介绍完了,下一篇文章我们将介绍几何图形之间的碰撞检测。 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
mvc框架--Razor

Razor 是一个轻巧而优雅的servlet mvc框架 # 又一个轮子? no,写就她是为了证实我个人的某些想法,并在这个过程中练练手,这两种冲动碰撞在一起,自然而然地产生了Razor # Razor的现在和未来...

dtubest
2013/01/25
3.1K
0
漏洞检测工具--Peach Fuzzer

Peach是一种用Python编写的 Fuzzer。这种工具有助于发现并公开许多漏洞,并认为是黑客和安全团体中最流行的工具之一。为了利用Peach框架,必须创建Phthon脚本,脚本 中包含了在服务器上执行的...

匿名
2013/02/06
8.8K
1
文档重复检测软件--DuplicateDetector

重复检测软件(Python实现) 可以检测英文文档之间的重复,包括完全重复(除标点,格式外都相同),和相近重复(部分(90%)抄袭) TODO: 1. 数据抄袭(英文文档中数据集中的地方,比较多的数据相...

zoowii
2012/11/01
782
0
2D物理引擎--Farseer

Farseer物理引擎运行于XNA框架,基于Box2D并有着更多功能的一个基于现实物理的碰撞检测系统,意味着你能使用这个引擎或者辅助工具更方便的创建游戏或者机器人模拟程序。使用Farseer 物理引擎...

sikele
2012/12/14
2K
0
复杂网络处理包--igraph

igraph是免费的复杂网络(graphs)处理包,可以处理百万级节点的网络(取决于机器内存)。igraph提供了R和C语言程序包,以及Python和Ruby语言扩展,它包括的功能包括: 网络可视化 传统图论算...

匿名
2013/04/20
6.6K
0

没有更多内容

加载失败,请刷新页面

加载更多

以渠道身份为数据背书,悟空榜如何呈现最真实的市场声音?

文 | 曾响铃 来源 | 科技向令说(xiangling0815) 时至今日,电商节已经成为各巨头零售平台例行的活动,花样在不断创新,玩法也在不断涌现。 在这个过程中,伴随电商节的各种品牌、产品销量榜...

曾响铃
前天
0
0
川普宣布拉黑微信支付!腾讯市值一度蒸发5000亿,45天后跟鹅厂发生交易都属违法

郭一璞 发自 凹非寺 量子位 报道 | 公众号 QbitAI 轮到腾讯和微信了。 谁都没想到,川普针对中国企业的举措会进展的这么快,就在刚刚,白宫官方网站po出一条总统行政命令: Executive Order ...

Java旅途
昨天
0
0
图解浏览器安全(同源策略、XSS、CSRF、跨域、HTTPS、安全沙箱等串成糖葫芦)

关注公众号“执鸢者”,获取大量教学视频并进入专业交流群,回复“安全”获取本节思维导图。 一天小林又去面试啦,面试官说:“小林呀,你对浏览器安全了解多少?”。小林摸了摸头说,目前我...

执鸢者
昨天
0
0
《乘风破浪的姐姐》:内容营销研究报告

《乘风破浪的姐姐》节目表现 大盘:同期热播的综艺中,《乘风破浪的姐姐》全面领先 6月12号以来,同期热播的综艺节目《乘风破浪的姐姐》播映指数排名第一,整体热度相对靠前;好评度、观看度等...

OSC_BMKOlH
昨天
0
0
TikTok遭遇十面埋伏的BGM,是美国Z时代人的抗议声 | 一周之最

原本是来中国街头吃吃吃,积累了不少粉丝的老外博主郭杰瑞,不知是不是因为央视的连线,顺应时势地变成了时政UP主,因疫情回到美国后,一直带着口罩在街头做采访,满足中国网友各种好奇。 从...

紫金山科技
前天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部