Javascript碰撞检测之间的圆和多边形

Javascript Collision Detection between circle and polygon?

本文关键字:多边形 碰撞检测 之间 Javascript      更新时间:2023-09-26

我不确定如何去定义碰撞检测功能的区域,当我有一个多边形,看起来像:

    ______
   / _____|
  / /
 / /
---

在fill/stroke调用之前,我使用lineTo()绘制了几次多边形,因此我知道所有点的x,y坐标轴。

目前我只是检查球是否超出了特定区域的点:

    if(tmpParticle.y <= platformBottom) {
        if(tmpParticle.x < leftPipe_middleX || tmpParticle.x > rightPipe_middleX) {
            tmpParticle = particleCollision(tmpParticle, platformBottom);
        }
    }
    if(tmpParticle.y <= pipeBottom && tmpParticle.y >= pipeBottom - 30) {
        if(tmpParticle.x < leftPipe_bottomRightX && tmpParticle.x > leftPipe_bottomLeftX) {
            tmpParticle = particleCollision(tmpParticle, pipeBottom);
        } else if (tmpParticle.x < rightPipe_bottomRightX && tmpParticle.x > rightPipe_bottomLeftX) {
            tmpParticle = particleCollision(tmpParticle, pipeBottom);
        }
    }

platformHeight将是"顶部水平线"的Y值。platformBottom将是"platformHeight下方的水平线"的Y值。rightPipe*用于所示示例。leftPipe*适用于相同的多边形,除了在另一个方向(形成一个管道,你必须在不碰撞的情况下将球射过)。

我的particleCollision()函数只接受tmpParticle并根据Y值(第二个参数,即pipeBottom)反转方向。这工作得很好,虽然我可能需要改进它以后。

我只是需要想出一个更好的方法来定义碰撞的面积。

您可以考虑将管道分成三角形,然后找到triangle - circle相交区域。如果它们相交,相交将总是一个convex polygon(面积很容易通过再次分成三角形来计算)和一个segment(面积也很容易计算- http://en.wikipedia.org/wiki/Circular_segment)。另一种情况是三角形本身,如果它完全位于圆内(也是一种简单的情况)。