【问题标题】:Javascript Collision Detection between circle and polygon?圆形和多边形之间的Javascript碰撞检测?
【发布时间】:2013-05-08 12:13:30
【问题描述】:

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

    ______
   / _____|
  / /
 / /
---

我在填充/描边调用之前使用 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 将是“平台高度正下方的水平线”的 Y 值 rightPipe* 用于所示示例。 leftPipe* 适用于同一个多边形,但在另一个方向除外(要形成管道,您必须将球射过而不会发生碰撞)。

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

我只需要找出一种更好的方法来定义碰撞区域。

【问题讨论】:

    标签: javascript math collision-detection


    【解决方案1】:

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

    【讨论】:

    • 所以对于管道部件(基本上就像标题为一侧的矩形),我只取 4 个点的坐标:上角 + 中角 + 左下角 + 右下角。比从中定义两个三角形(应该不会太难):然后使用凸多边形算法进行检测?
    • 是的,也看看这里stackoverflow.com/questions/5518940/…
    猜你喜欢
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    相关资源
    最近更新 更多