帆布:大圆圈内的球应该偏转

时间:2012-10-09 22:21:16

标签: javascript canvas html5-canvas

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

    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;
                        } 

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

1 个答案:

答案 0 :(得分: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)完全环绕较小的圆圈。如果该圆圈的大小或外圈尺寸相同,则会发生碰撞。

如果你仍然有不准确的碰撞,那可能是一个舍入错误。