我有一个小圆圈,在一个更大的圆圈内。小圆圈飞来飞去,如果小圆圈到达大圆圈的边界,它就会发生碰撞。我几乎设法这样做了,但它仍然不能完美。有时圆圈在边界之前碰撞,有时在边界之后碰撞。这是我的代码:
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;
}
为什么这不起作用的任何想法?
答案 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)完全环绕较小的圆圈。如果该圆圈的大小或外圈尺寸相同,则会发生碰撞。
如果你仍然有不准确的碰撞,那可能是一个舍入错误。