2016-12-25 114 views
1

目前我正在研究2D粒子模拟器。我有每个粒子以独特的角度移动。我找到了一个改变x和y速度的基本公式,但是我现在有一个根据角度移动的设定速度。2D垂直角度碰撞

particles[a][3] += particles[a][1] * cos(radians(particles[a][5]));//move X 
particles[a][4] += particles[a][1] * sin(radians(particles[a][5]));//move Y 

我对墙上的碰撞有一个基本的碰撞,但找不到排除碰撞的最佳方法。目前我只是将旋转乘以-1,但只能在顶部和底部工作。注意:运行碰撞后,粒子将始终移动(它不会卡在碰撞盒中,并且会陷入困境)。

if(particles[a][3] < 0 || particles[a][3] > windowWidth/2 || particles[a][4] < 0 || particles[a][4] > windowHeight/2) { 
    /*windowWidth and windowHeight are divided by 2 to find the canvas size. In the setup() I have the canvas set to that value).*/ 
    particles[a][5] *= -1; 
} 

数组值:

particles[a][1] = speed 
particles[a][3] = x position 
particles[a][4] = y position 
particles[a][5] = rotation 

我的问题是什么是运行这些碰撞测试的最好方法。我明白碰撞会以90度反弹,但我希望尽可能少地使用陈述(简单得多)而不是繁琐的一堆。

圣诞快乐,并提前致谢!


想通了! 最终代码:

if(particles[a][4] < 0 || particles[a][4] > windowHeight/2) { 
    particles[a][5] *= -1; 
} else if(particles[a][3] < 0 || particles[a][3] > windowWidth/2) { 
    particles[a][5] = 180 - particles[a][5]; 
} 

回答

0

尝试谷歌搜索“的JavaScript反映角”,你会发现公式绕X轴和Y轴都反映了。当你碰到顶部或底部时,你做一个,当你碰到左边或右边时,你做另一个。

此外,你可能不应该使用数组来保存你的数据。创建一个保存你的值的类,然后创建该类的实例。使用魔术数组索引是令人头疼的秘诀。

如果你仍然无法正常工作,那么请发帖MCVE,我们将从那里开始。祝你好运。

+0

完全打开阵列替代。你能给我一个关于实例的推荐学习指南的链接吗?现在检出javascript反射角度的东西。 – bdkopen

+0

得到了正确反映的y轴。仍然对学习这些实例感兴趣。 – bdkopen