JavaScript画布复杂形状冲突

JavaScript画布复杂形状冲突,javascript,html,canvas,collision-detection,Javascript,Html,Canvas,Collision Detection,我试图用HTML画布和JavaScript制作一个非常简单的游戏。我发现了许多关于在画布上检测基本形状(如矩形和圆形)碰撞的教程和问题。但我想知道是否有可能检测到一个复杂形状(由许多基本形状组成的形状)是否与另一个形状发生碰撞,或者两个复杂形状是否发生碰撞。如果是的话,如何做到这一点?提前谢谢 一般算法不会提供比专门基于每种形状类型的知识的算法更好的解决方案 通常,对于复杂(即复合)形状,您通常会尝试步骤1和“提前退出”测试。出于优化的原因,您通常会尽可能早地尝试消除误报 因为简单的步骤#1是测

我试图用HTML画布和JavaScript制作一个非常简单的游戏。我发现了许多关于在画布上检测基本形状(如矩形和圆形)碰撞的教程和问题。但我想知道是否有可能检测到一个复杂形状(由许多基本形状组成的形状)是否与另一个形状发生碰撞,或者两个复杂形状是否发生碰撞。如果是的话,如何做到这一点?提前谢谢

一般算法不会提供比专门基于每种形状类型的知识的算法更好的解决方案

通常,对于复杂(即复合)形状,您通常会尝试步骤1和“提前退出”测试。出于优化的原因,您通常会尽可能早地尝试消除误报

因为简单的步骤#1是测试每个复合形状的“边界框”上的碰撞。如果边界框不重叠,则可以提前退出并假定没有碰撞,因为复合形状不能碰撞(请参见)

如果边界框测试无法提前消除,则需要使用最适合该形状的算法(圆-圆、圆-矩形等)依次测试每个子形状,将最“昂贵”的测试留给最后一个多边形


您可能还想看看这个问题

与专门基于每种形状类型的知识的算法相比,通用算法不会提供更好的解决方案

通常,对于复杂(即复合)形状,您通常会尝试步骤1和“提前退出”测试。出于优化的原因,您通常会尽可能早地尝试消除误报

因为简单的步骤#1是测试每个复合形状的“边界框”上的碰撞。如果边界框不重叠,则可以提前退出并假定没有碰撞,因为复合形状不能碰撞(请参见)

如果边界框测试无法提前消除,则需要使用最适合该形状的算法(圆-圆、圆-矩形等)依次测试每个子形状,将最“昂贵”的测试留给最后一个多边形



您可能还想看看这个问题,除非您向我们展示您的代码,否则我们无法帮助您。@ScottMarcus为什么需要我的代码?因为每个问题都有很多解决方法。看到您正在使用的代码,我们可以给出更好的答案。@ScottMarcus我目前无法访问我的代码,但如果您愿意,我可以概述我的程序。如果复杂形状是由简单形状组成的,并且您知道如何在简单形状中检测碰撞,那么。。。(还)除非您向我们展示您的代码,否则我们无法帮助您。@ScottMarcus为什么需要我的代码?因为每个问题都有很多解决方法。看到您正在使用的代码,我们可以给出更好的答案。@ScottMarcus我目前无法访问我的代码,但如果您愿意,我可以概述我的程序。如果复杂形状是由简单形状组成的,并且您知道如何在简单形状中检测碰撞,那么。。。(还)谢谢你的回答。我将尝试在我的程序中实现这一点。此外,除了边界框之外,还有其他“误报”可用于测试吗?另一个可能有用的优化(取决于您的应用程序)是将空间划分为扇区或网格。然后,您只需要测试可能重叠的候选项,即在边界框测试之前消除测试。例如,如果您将游戏世界划分为一个10x10的网格,那么完全包含在网格(0,0)中的那些复合形状只需要相互测试,而所有其他形状都被消除。请注意,在角点处,形状交叉网格边界时要小心。是的,这些效果很好。除非你在任何时候都有很多演员/人物在活动,否则这可能会有点过头。你在第一篇评论中提到的四叉树是什么?如果没有,区别是什么?我说的是一种更简单的空间分割技术。这是非常基本的-您不需要对每个可能的复合形状和每个其他复合形状进行边界框测试。相反,您可以根据这些形状所在的网格框来决定哪些形状可能重叠。那些完全包含在不同盒子中的形状不能重叠。这是四叉树lite。同样,配置取决于您的应用程序。谢谢您的回答。我将尝试在我的程序中实现这一点。此外,除了边界框之外,还有其他“误报”可用于测试吗?另一个可能有用的优化(取决于您的应用程序)是将空间划分为扇区或网格。然后,您只需要测试可能重叠的候选项,即在边界框测试之前消除测试。例如,如果您将游戏世界划分为一个10x10的网格,那么完全包含在网格(0,0)中的那些复合形状只需要相互测试,而所有其他形状都被消除。请注意,在角点处,形状交叉网格边界时要小心。是的,这些效果很好。除非你在任何时候都有很多演员/人物在活动,否则这可能会有点过头。你在第一篇评论中提到的四叉树是什么?如果没有,区别是什么?我说的是一种更简单的空间分割技术。这是非常基本的-您不需要对每个可能的复合形状和每个其他复合形状进行边界框测试。相反,您可以根据这些形状所在的网格框来决定哪些形状可能重叠。那些完全包含在不同盒子中的形状不能重叠。这是四叉树lite。同样,配置完全取决于您的应用程序。