如何修复此代码以正确检测重叠的圆?
通过测试起点的位置来指定第一个圆。该第一个圆应该是重叠圆图的基础。现在,仅当被测圆在非分支线中重叠时才有效...
(单个圆圈为[x,y,radius])
var circles = [
[6, 19, 1],
[6, 11, 4],
[8, 17, 3],
[19, 19, 2],
[19, 11, 4],
[15, 7, 6],
[12, 19, 4]
];
var i = 0;
var j = 0;
var start = [10, 19];
var starts = false;
var overlapping = [];
var isInside = function(point, list, check, push) {
var temp = list.filter(function(item) { return Math.pow(item[0] - point[0], 2) + Math.pow(item[1] - point[1], 2) < item[2] * item[2] });
if (push) { overlapping = overlapping.concat(temp) };
return temp.length > 0
};
starts = isInside(start, circles, starts, true);
var overlappingCirclesTest = function() {
if (j < circles.length && overlapping.length > 0) {
var i = overlapping.length - 1;
var r0 = overlapping[i][2];
var r1 = circles[j][2];
var x0 = overlapping[i][0];
var x1 = circles[j][0];
var y0 = overlapping[i][1];
var y1 = circles[j][1];
if (Math.hypot(x0 - x1, y0 - y1) <= (r0 + r1)) {
overlapping.push(circles[j]);
circles.splice(circles.indexOf(circles[j]), 1);
j = 0;
overlappingCirclesTest();
}
j++;
overlappingCirclesTest();
}
}
overlappingCirclesTest();
编辑:为澄清起见:我们有一个可能重叠的圆和两个点的数组,起点和终点。我们想要产生一条重叠的圆的路径,从一个以start开始的圆到一个以end结尾的圆结束。可能有几种潜在的路径,我们只想知道是否有任何路径。
最佳答案
因此,这是一个非常基本的碰撞检查系统。每当您更新时,运行Collision并传递要检查碰撞的圆的参数。
function Collision (x, y, r) {
for (i=0; i<circles.length; i++) {
//Distance formula
if (Math.sqrt((x-circles[i].x)(x-circles[i].x) + (y-circles[i].y)(y-circles[i].y) < r) {
return true;
}
}
这是一个圆对象的示例,以及如何调用它:
function Circle() {
this.x = Math.random()*100;
this.y = Math.random()*100;
this.r = Math.random()*50;
this.update = function() {
if (Collision(this.x, this.y, this.r) {
console.log("circle collided with another circle");
}
}
};
此外,您可以检出我创建的项目的来源,该项目使用了很多圆圈,并检查了所有圆圈和播放器之间的碰撞。 http://betaio.bitballoon.com