package prefuse.util.force; import java.util.ArrayList; /** * Represents a spring in a force simulation. * * @author <a href="http://jheer.org">jeffrey heer</a> */ public class Spring { private static SpringFactory s_factory = new SpringFactory(); /** * Retrieve the SpringFactory instance, which serves as an object pool * for Spring instances. * @return the Spring Factory */ public static SpringFactory getFactory() { return s_factory; } /** * Create a new Spring instance * @param fi1 the first ForceItem endpoint * @param fi2 the second ForceItem endpoint * @param k the spring tension co-efficient * @param len the spring's resting length */ public Spring(ForceItem fi1, ForceItem fi2, float k, float len) { item1 = fi1; item2 = fi2; coeff = k; length = len; } /** The first ForceItem endpoint */ public ForceItem item1; /** The second ForceItem endpoint */ public ForceItem item2; /** The spring's resting length */ public float length; /** The spring tension co-efficient */ public float coeff; /** * The SpringFactory is responsible for generating Spring instances * and maintaining an object pool of Springs to reduce garbage collection * overheads while force simulations are running. */ public static final class SpringFactory { private int maxSprings = 10000; private ArrayList springs = new ArrayList(); /** * Get a Spring instance and set it to the given parameters. */ public Spring getSpring(ForceItem f1, ForceItem f2, float k, float length) { if ( springs.size() > 0 ) { Spring s = (Spring)springs.remove(springs.size()-1); s.item1 = f1; s.item2 = f2; s.coeff = k; s.length = length; return s; } else { return new Spring(f1,f2,k,length); } } /** * Reclaim a Spring into the object pool. */ public void reclaim(Spring s) { s.item1 = null; s.item2 = null; if ( springs.size() < maxSprings ) springs.add(s); } } // end of inner class SpringFactory } // end of class Spring