2D多边形碰撞检测

14

有没有人知道一种简单的方法来检查两个多边形,特别是矩形是否发生了碰撞?我找到了一种简单的方法来检查它们是否接触,只需检查两个矩形上的任何线条是否发生了碰撞,但如果一个多边形在另一个多边形中,则这种方法将不起作用。有没有人知道更有效的方法或只是可行的方法?

此外,有人可以给我一个公式之类的东西,而不仅仅是你对这个主题的想法吗?

谢谢


矩形的边是否与X轴和Y轴对齐?顺便提一下,可以查看相关问题:https://dev59.com/YFDTa4cB1Zd3GeqPM-W7 - Arun
4个回答

19

查找分离轴定理。这里有一个教程(点击链接)

它快速、优雅、稳健、不太难,而且有很多资源。


2
如果你的代码只涉及到矩形,但是永远不要忘记分离轴定理仅适用于凸多边形。 - Madlozoz
链接失效:https://web.archive.org/web/20201112031353/https://www.metanetsoftware.com/technique/tutorialA.html - Isaac Skelton

12

请查看http://www.metanetsoftware.com/technique/tutorialA.html

这个网站在我开发自己的碰撞检测例程时帮了我很多。根据可用处理能力,你可以做任何你想要的关于碰撞准确性的事情。从最少处理器使用的开始:

1) 包围盒: 适用于矩形形状且启动快速。你只需要知道物体的(x, y)位置以及宽度和高度。

2) 分离轴定理(SAT): 能够处理更复杂的形状,而且相当直观。

3) 具有Voronoi区域(VR)的SAT: 使用关于任何给定多边形的哪个顶点最接近的信息以减少总计算次数。

以上所有内容都在上面的链接中详细解释。值得注意的是,到目前为止,上述方法对于凸多边形最为有效。如果你想达到荒谬的准确性水平,就会开始进入类似于位图测试这样的东西,那非常缓慢,而且通常是过度杀伤力的工具。


1

有几种方法,简单的方法只是检查X或Y边界是否重叠。然而,这仅适用于与轴对齐的矩形。

还有边界检查,即一个对象的角是否在另一个对象的坐标范围内。

从那里开始,碰撞检测变得更加先进。检查是否可以在任何方向上画一条线。


顺便提一下,我之前提到的最后一种方法是分离轴定理。使用哪种方法取决于需要什么精确的结果。 - ewanm89

-7

例子:

矩形A

左上角坐标(x,y)。宽度,高度。

矩形B

左上角坐标(x1,y1)。

条件

(x>=x1)且(x<=x1+width)=> x轴碰撞。对于y轴也是一样的,只需用y和y1以及height。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接