我遇到了一个我无法理解的碰撞问题。我的程序的要点是在一个1920x900的边界框中生成一个随机数的圆圈(2到15之间)和随机速度。如果他们互相接触,他们就应该朝着相反的方向飞去(不是很好的物理,我知道,但是后来会来。)
为此,我有四个阵列:两个用于圆圈的坐标(xcords []和ycords [],两个用于每个圆圈的动量(xdirs []和ydirs [])。
这是我的碰撞功能
function collides(x, y)
{
if(Math.hypot(xcords[y]-xcords[x], ycords[y]-ycords[x]) < 50)
{
return true;
}
else return false;
}
当我对某些值进行硬编码时,例如
if(collides(xcords[1],xcords[0])
{
xdirs[0] *= -1;
xdirs[1] *= -1;
ydirs[0] *= -1;
ydirs[1] *= -1;
}
然后它工作正常。我硬编码的两个圆圈将正确碰撞。但是,当我尝试将其应用于每个圈子时:
for(i=0; i<circles; i++)
{
for(j=0; j<circles; j++)
{
if(collides(xcords[i], xcords[j]))
{
xdirs[i] *= -1;
xdirs[j] *= -1;
ydirs[i] *= -1;
ydirs[j] *= -1;
}
}
}
然后圈子互相忽略,我不明白为什么。这是我在这段代码中唯一一次使用double for循环,但是我多次执行第一次for循环,并且它正确地为每个其他函数处理它。
这是一个jsfiddle。 https://jsfiddle.net/sekbr0pg/ 边界框略有偏差,但足以看到碰撞是不稳定的。
答案 0 :(得分:0)
我们选择圈1和圈2.你想检查它们是否只碰撞一次。以下循环是否适用于此?
for(i=0; i<circles; i++) {
for(j=0; j<circles; j++){
// if collides ...
}
}
答案是否定的,原因是它们会针对i=1 and j=2
和i=2 and j=1
运行两次。所以基本上它不会改变任何东西,因为-1 * -1 = 1.在你的循环中将j=0
更改为j=i+1
。
此外,您的collides
功能接受圈子,因此我认为collides(i,j)
可以完成这项工作。