二维垂直 angular 碰撞

2D vertical angular collisions

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

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 语句(越简单越好)而不是一堆乏味的东西。

圣诞快乐,提前致谢!


想通了! 最终代码:

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];
}

尝试谷歌搜索 "javascript reflect angle",您会找到用于反映 X 轴和 Y 轴的公式。撞上或撞底你做一个,撞左或右你做另一个。

此外,您可能不应该使用数组来保存数据。创建一个包含您的值的 class,然后创建该 class 的实例。使用魔术数组索引是一个令人头疼的方法。

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