为什么这个功能没有检测到重叠的圆圈?

时间:2014-01-09 19:28:48

标签: javascript html5 canvas

http://jsfiddle.net/goldrunt/SeAGU/52/ 第49行在创建新对象之前检查isOnCircle函数的“false”。函数在第32行。当创建更多对象时,该函数在不应该通过时传递。

 if (isOnCanvas(location) && !isOnCircle(location)) {
        console.log(location, isOnCanvas(location), isOnCircle(location));
        create(location);

事实上,无论传递给它的值是什么,我都无法将碰撞检测注册为真实

(Math.pow((a.x - i.x), 2) + Math.pow((a.y - i.y), 2) <= Math.pow((a.radius + i.radius), 2))

2 个答案:

答案 0 :(得分:3)

这里我已修复并提供了更多描述性变量名称,以便您可以看到正在发生的事情。 编辑:我注意到你并不总是提供一个圆圈但有时候一个点为A,它没有.radius属性导致NaN,这也搞砸了你的比较。

function circleTest(a,b) {
    var DistanceX = a.x - b.x;
    var DistanceY = a.y - b.y;
    var DistanceCenter = Math.sqrt(DistanceX * DistanceX + DistanceY * DistanceY);
    var CollisionDistance = b.radius;
    if (a.radius) CollisionDistance += a.radius
    return DistanceCenter <= CollisionDistance;
}

我还注意到你的函数中出现了一个名为“isOnCircle”的问题,你使用i(一个数字)就像它是一个圆形对象一样,上面这个函数可以修复如下:

function isOnCircle(a) {
    for (var i = 0; i < circles.length; i++) {
        if (circleTest(a, circles[i])) return true;
    }
    return false;
}

答案 1 :(得分:1)

两个问题:

  • i是您用于遍历circles数组的数字索引,但您正在使用它,就好像它是一个圆形对象;您需要使用circles[i]在每次迭代时获取圆圈。
  • a是一个点,没有半径(在下面的代码中我离开{​​{1}}只是在你传入一个圆圈而不是一个点并且{{1}用0编辑它,这样你得到一个有效的数字。)

定义一些额外的变量(为了清楚起见),然后你可以用这个替换a.radius函数:

OR