JavaScript中的圆形碰撞

9

为了学校作业,我需要使用 JavaScript 编写一个判断圆形是否碰撞的程序。

不需要图形展示。

我尝试过编写代码,但好像并不起作用。请问如何修复?

这是我编写的代码:

function collision (p1x, p1y, r1, p2x, p2y, r2) {
    var a;
    var x;
    var y;

    a = r1 + r2;
    x = p1x - p2x;
    y = p1y - p2y;

    if (a > (x*x) + (y*y)) {
        return true;
    } else {
        return false;
    }
}
var collision = collision(5, 500, 10, 1000, 1500, 1500);
alert(collision);

2
你的公式里难道不是缺了什么东西吗? - Jørgen
你可以将返回语句更改为return (a > (x*x) + (y*y));,而不是使用if来返回true或false,因为这已经是条件了。或者更好的方法是将条件存储在一个名为var isCollision = (a > (x*x) + (y*y));的变量中,然后return isCollision;。这样做可以使代码更易读。同时,不要将变量名collision用于两个不同的事物。 - CaffGeek
重新阅读距离公式。你已经接近了,但是有一部分还缺失。 - Nate B
一个好的调试问题的方法是逐步执行代码。 - John Kane
3个回答

12

你的检查应该是if (a > Math.sqrt((x*x) + (y*y)))

http://cgp.wikidot.com/circle-to-circle-collision-detection

所以完整的代码是:

function collision(p1x, p1y, r1, p2x, p2y, r2) {
  var a;
  var x;
  var y;

  a = r1 + r2;
  x = p1x - p2x;
  y = p1y - p2y;

  if (a > Math.sqrt((x * x) + (y * y))) {
    return true;
  } else {
    return false;
  }
}
var collision = collision(5, 500, 10, 1000, 1500, 1500);
console.log(collision);


如果希望不那么计算密集的实现(使用ES7语法的代码段),可以使用:


const checkCollision = (p1x, p1y, r1, p2x, p2y, r2) => ((r1 + r2) ** 2 > (p1x - p2x) ** 2 + (p1y - p2y) ** 2)

var collision = checkCollision(5, 500, 10, 1000, 1500, 1500);
console.log(collision);

正如 Darek Rossman 在 他的回答中所示。


3
在你的if语句中,尝试使用以下代码:
if ( a * a > (x * x + y * y) ) {
    ...
} else {
    ...
}

0

一个三角形的长度,其两边为dxdy(即点(x1, y1)(x2, y2)之间的距离,其中dx = x2 - x1dy = y2 - y1),等于:

sqrt(dx^2 + dy^2)

所以您可能想要:

if(a > Math.sqrt(x*x + y*y)) {

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接