手记

球体碰撞之后速度分析

其中particles为数组,用来存放所有球体
mass为质量
Vx,Vy分别为x,y方向速度
原理为动能,动量守恒
缺点:受到运算精度的限制,只有在碰撞瞬间才有效,若是重叠则会发生错误



//遍历所有对象
for (let fir = 0; fir < Particles.length; fir++) {
for (let sec = fir + 1; sec < Particles.length; sec++) {
//水平差值
var dx = Particles[sec].coordinate.x - Particles[fir].coordinate.x;
//垂直差值
var dy = Particles[sec].coordinate.y - Particles[fir].coordinate.y;
//距离平方
var dis2 = Math.pow(dx, 2) + Math.pow(dy, 2);
//距离
var dis = Math.floor(Math.sqrt(dis2))+1;
//沿半径方向速度分量
var v1p = (Particles[fir].velocity.Vy * dy + Particles[fir].velocity.Vx * dx) / dis;
var v2p = (Particles[sec].velocity.Vy * dy + Particles[sec].velocity.Vx * dx) / dis;
//垂直半径方向速度分量
var v1c = (Particles[fir].velocity.Vy * dx + Particles[fir].velocity.Vx * dy) / dis;
var v2c = (Particles[sec].velocity.Vy * dx + Particles[sec].velocity.Vx * dy) / dis;
//碰撞后重新分配的沿半径方向速度分量
var _v1p = ((Particles[fir].mass - Particles[sec].mass) * v1p + 2 * Particles[sec].mass * v2p) / (Particles[fir].mass + Particles[sec].mass);
var _v2p = ((Particles[sec].mass - Particles[fir].mass) * v2p + 2 * Particles[fir].mass * v1p) / (Particles[fir].mass + Particles[sec].mass);
//重新合成的xy速度分量
Particles[fir].velocity.Vy = _v1p * dy / dis + v1c * dx / dis;
Particles[fir].velocity.Vx = _v1p * dx / dis + v1c * dy / dis;
Particles[sec].velocity.Vy = _v2p * dy / dis + v2c * dx / dis;
Particles[sec].velocity.Vx = _v2p * dx / dis + v2c * dy / dis;}

0人推荐
随时随地看视频
慕课网APP