package edu.uci.ics.jung.visualization.layout; import java.awt.geom.Point2D; import edu.uci.ics.jung.algorithms.layout.Layout; import edu.uci.ics.jung.algorithms.layout.StaticLayout; import edu.uci.ics.jung.algorithms.layout.util.Relaxer; import edu.uci.ics.jung.algorithms.layout.util.VisRunner; import edu.uci.ics.jung.algorithms.util.IterativeContext; import edu.uci.ics.jung.graph.Graph; import edu.uci.ics.jung.visualization.VisualizationViewer; public class LayoutTransition<V,E> implements IterativeContext { protected Layout<V,E> startLayout; protected Layout<V,E> endLayout; protected Layout<V,E> transitionLayout; protected boolean done = false; protected int count = 20; protected int counter = 0; protected VisualizationViewer<V,E> vv; /** * @param startLayout * @param endLayout */ public LayoutTransition(VisualizationViewer<V,E> vv, Layout<V, E> startLayout, Layout<V, E> endLayout) { this.vv = vv; this.startLayout = startLayout; this.endLayout = endLayout; if(endLayout instanceof IterativeContext) { Relaxer relaxer = new VisRunner((IterativeContext)endLayout); relaxer.prerelax(); } this.transitionLayout = new StaticLayout<V,E>(startLayout.getGraph(), startLayout); vv.setGraphLayout(transitionLayout); } public boolean done() { return done; } public void step() { Graph<V,E> g = transitionLayout.getGraph(); for(V v : g.getVertices()) { Point2D tp = transitionLayout.transform(v); Point2D fp = endLayout.transform(v); double dx = (fp.getX()-tp.getX())/(count-counter); double dy = (fp.getY()-tp.getY())/(count-counter); transitionLayout.setLocation(v, new Point2D.Double(tp.getX()+dx,tp.getY()+dy)); } counter++; if(counter >= count) { done = true; vv.setGraphLayout(endLayout); } vv.repaint(); } }