package prefuse.util.force;
import java.util.Iterator;
/**
* Updates velocity and position data using Euler's Method. This is the
* simplest and fastest method, but is somewhat inaccurate and less smooth
* than more costly approaches.
*
* @author <a href="http://jheer.org">jeffrey heer</a>
* @see RungeKuttaIntegrator
*/
public class EulerIntegrator implements Integrator {
/**
* @see prefuse.util.force.Integrator#integrate(prefuse.util.force.ForceSimulator, long)
*/
public void integrate(ForceSimulator sim, long timestep) {
float speedLimit = sim.getSpeedLimit();
Iterator iter = sim.getItems();
while ( iter.hasNext() ) {
ForceItem item = (ForceItem)iter.next();
item.location[0] += timestep * item.velocity[0];
item.location[1] += timestep * item.velocity[1];
float coeff = timestep / item.mass;
item.velocity[0] += coeff * item.force[0];
item.velocity[1] += coeff * item.force[1];
float vx = item.velocity[0];
float vy = item.velocity[1];
float v = (float)Math.sqrt(vx*vx+vy*vy);
if ( v > speedLimit ) {
item.velocity[0] = speedLimit * vx / v;
item.velocity[1] = speedLimit * vy / v;
}
}
}
} // end of class EulerIntegrator