我遇到了一个我不太清楚的碰撞问题。我的程序的重点是生成一个随机数的圆圈(在2到15之间),在一个包围框中,这个圆圈的速度是1920x900。如果它们互相碰触,它们就应该朝相反的方向飞去(我知道,这不是很好的物理,但以后就会发生)。
要做到这一点,我有四个数组:两个是圆的坐标(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循环,并且它对每个其他函数都正确地处理它。
这是一把小提琴。https://jsfiddle.net/sekbr0pg/的包围盒有点偏离,但它足以看到碰撞是摇摇欲坠的。
发布于 2016-01-29 08:31:33
让我们以圆圈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)
将完成这项工作。
https://stackoverflow.com/questions/35088575
复制相似问题