0

我有一个小圆圈,在一个更大的圆圈内。小圆圈在飞来飞去,如果小圆圈到达大圆圈的边界,它应该会发生碰撞。我几乎设法做到了,但它仍然不能完美地工作。有时圆在边界之前碰撞,有时在边界之后。这是我的代码:

    if (!(Math.pow((xSmallCircle + radiusSmallCircle) - (xBigCircle), 2) + Math.pow((
    ySmallCircle + radiusSmallCircle) - yBigCircle, 2) < Math.pow(radiusBigCircle + 10, 2))) {
                                    xVelocity *= -1;
                                    yVelocity *= -1;
    } else if (!(Math.pow((xSmallCircle - radiusSmallCircle) - (xBigCircle), 2) + Math.pow((
    ySmallCircle - radiusSmallCircle) - yBigCircle, 2) < Math.pow(radiusBigCircle + 10, 2))) {
                                        xVelocity *= -1;
                                        yVelocity *= -1;
    } else if (!(Math.pow((xSmallCircle + radiusSmallCircle) - (xBigCircle), 2) + Math.pow((
    ySmallCircle - radiusSmallCircle) - yBigCircle, 2) < Math.pow(radiusBigCircle + 10, 2))) {
                                        xVelocity *= -1;
                                        yVelocity *= -1;              
    } else if (!(Math.pow((xSmallCircle - radiusSmallCircle) - (xBigCircle), 2) + Math.pow((
    ySmallCircle + radiusSmallCircle) - yBigCircle, 2) < Math.pow(radiusBigCircle + 10, 2))) {
                                        xVelocity *= -1;
                                        yVelocity *= -1;
                        } 

任何想法为什么这不起作用?

4

1 回答 1

0

这是因为您只在四个点检查碰撞,实际上都在内圈之外。尝试一种更简单且数学上正确的碰撞检测机制。

var sep = Math.sqrt(
      Math.pow(xSmallCircle-xBigCircle, 2) 
      + Math.pow(ySmallCircle-yBigCircle, 2)
);
if( sep + radiusSmallCircle + borderWidthSmallCircle >= radiusBigCircle ){
    //You have a collision Here
}

这里的逻辑是,如果你计算每个圆的中心之间的线段的长度,并加上小圆的半径,你会得到最小圆的半径,即(a)与外圆同心, (b) 完全包围较小的圆圈。如果那个圆比你的外圆更大或大小相同,你就会发生碰撞。

如果您仍然有不精确的碰撞,则可能是舍入错误。

于 2012-10-09T22:48:14.927 回答