球的二维弹性碰撞

我正在尝试在java中创建一个简单的弹性碰撞模拟。 (我正在使用一些像StdRandom助手库)

这是我的球类:

class Ball { double cx, cy; Vector velocity; double radius; double mass; public Ball() { mass = 1.0; radius = 0.025; cx = StdRandom.uniform( 0.000+radius, 1.000-radius ); cy = StdRandom.uniform( 0.000+radius, 1.000-radius ); // vx = 0.015; // vy = 0.025; velocity = new Vector(); velocity.setX( StdRandom.uniform( 0.0010, 0.015 ) ); velocity.setY( StdRandom.uniform( 0.0010, 0.015 ) ); } public void move() { cx = cx + velocity.getX(); cy = cy + velocity.getY(); } // getter methods public double getCx(){ return cx; } public double getCy(){ return cy; } public double getVx(){ return velocity.getX(); } public double getVy(){ return velocity.getY(); } public double getRadius(){ return radius; } public double getMass(){ return mass; } // setter methods public void setCx( double val ){ cx = val; } public void setCy( double val ){ cy = val; } public void setVx( double val ){ velocity.setX( val ); } public void setVy( double val ){ velocity.setY( val ); } public void setRadius( double val ){ radius = val; } public void setMass( double val ){ mass = val; } } 

这里是我解决冲突的方法:

 if ( distSqr == radii_sum*radii_sum ) { double phi, theta1, theta2; // collision angle, a's movement angle, b's movement angle double v1, v2; // scalar values of velocity for balls a and b double m1, m2; // mass for ball's a and b double v1xf, v1yf, v2xf, v2yf; // x and y components of final velocities after collision // calculate angles phi = Math.atan2( cy1-cy2, cx1-cx2 ); theta1 = Math.atan2( a.getVy(), a.getVx() ); theta2 = Math.atan2( b.getVy(), b.getVx() ); // get mass m1 = a.getMass(); m2 = b.getMass(); // calculate scalar values of velocities v1 = Math.sqrt( a.getVx()*a.getVx() + a.getVy()*a.getVy() ); v2 = Math.sqrt( b.getVx()*b.getVx() + b.getVy()*b.getVy() ); v1xf = ((((v1 * Math.cos(Math.toRadians(theta1 - phi)) * (m1 - m2)) + (2 * m2 * v2 * Math.cos(Math.toRadians(theta2 - phi)))) / (m1 + m2)) * Math.cos(Math.toRadians(phi))) + (v1 * Math.sin(Math.toRadians(theta1 - phi)) * Math.cos(Math.toRadians(phi + (Math.PI/2)))); v2xf = ((((v2 * Math.cos(Math.toRadians(theta2 - phi)) * (m2 - m1)) + (2 * m1 * v1 * Math.cos(Math.toRadians(theta1 - phi)))) / (m1 + m2)) * Math.cos(Math.toRadians(phi))) + (v2 * Math.sin(Math.toRadians(theta2 - phi)) * Math.cos(Math.toRadians(phi + (Math.PI/2)))); v1yf = ((((v1 * Math.cos(Math.toRadians(theta1 - phi)) * (m1 - m2)) + (2 * m2 * v2 * Math.cos(Math.toRadians(theta2 - phi)))) / (m1 + m2)) * Math.sin(Math.toRadians(phi))) + (v1 * Math.sin(Math.toRadians(theta1 - phi)) * Math.sin(Math.toRadians(phi + (Math.PI/2)))); v2yf = ((((v2 * Math.cos(Math.toRadians(theta2 - phi)) * (m2 - m1)) + (2 * m1 * v1 * Math.cos(Math.toRadians(theta1 - phi)))) / (m1 + m2)) * Math.sin(Math.toRadians(phi))) + (v2 * Math.sin(Math.toRadians(theta2 - phi)) * Math.sin(Math.toRadians(phi + (Math.PI/2)))); a.setVx( v1xf ); a.setVy( v1yf ); b.setVx( v2xf ); b.setVy( v2yf ); } 

我有一些问题 –

  1. 我是否正确计算了标量速度和角度? 代码不起作用,球通过对方,有时甚至推动其他球超出边界。
  2. 我如何反映速度? 由于上面给出的x和y分量或单速variables和角度? 如果后者那么我可以使用不同的速度的X和Y组件?
  3. 我应该使用时间步进行碰撞检测吗? 如果是的话,一个例子会有所帮助!
  4. 我尝试使用随机生成的角度,并将其更改为碰撞:
    1. (垂直墙)newangle = 180-oldangle
    2. (水平墙)newangle =(oldangle> 180)? 360 – (oldangle – 180):180角

它工作,但它成为一个专门的情况。 如何为所有行使用generics(因为x,y轴确实是行)? 我知道它使用正常,但不知道整个事情。

碰撞方法已经通过下面的链接编程。

维基百科在两个维度弹性碰撞,两个球移动

我已经find了解决办法,虽然部分。

显然对于球碰撞,切向分量保持相同,因为没有力沿着它作用。 所以法向分量可以用一维牛顿公式进行弹性碰撞计算。

有两个问题。

  1. 我必须编写专门的硬编码值的墙碰撞案例代码。
  2. 速度不能超过每帧2 *半径。 如果高于这个值,球会跳过碰撞检测,并可能卡在其他球中。

由于这不是一个完整的应用程序,这个解决scheme现在可以做得很好。

我在这个链接中使用了这个过程