public interface Integrator { public void step( float t ); } public class ModifiedEulerIntegrator implements Integrator { ParticleSystem s; public ModifiedEulerIntegrator( ParticleSystem s ) { this.s = s; } public void step( float t ) { s.clearForces(); s.applyForces(); float halftt = 0.5f*t*t; for ( int i = 0; i < s.numberOfParticles(); i++ ) { Particle p = s.getParticle( i ); if ( p.isFree() ) { float ax = p.force().x()/p.mass(); float ay = p.force().y()/p.mass(); float az = p.force().z()/p.mass(); p.position().add( p.velocity().x()/t, p.velocity().y()/t, p.velocity().z()/t ); p.position().add( ax*halftt, ay*halftt, az*halftt ); p.velocity().add( ax/t, ay/t, az/t ); } } } } public class EulerIntegrator implements Integrator { ParticleSystem s; public EulerIntegrator( ParticleSystem s ) { this.s = s; } public void step( float t ) { s.clearForces(); s.applyForces(); for ( int i = 0; i < s.numberOfParticles(); i++ ) { Particle p = (Particle)s.getParticle( i ); if ( p.isFree() ) { p.velocity().add( p.force().x()/(p.mass()*t), p.force().y()/(p.mass()*t), p.force().z()/(p.mass()*t) ); p.position().add( p.velocity().x()/t, p.velocity().y()/t, p.velocity().z()/t ); } } } } public interface Force { public void turnOn(); public void turnOff(); public boolean isOn(); public boolean isOff(); public void apply(); }