1 package edu.uci.ics.jung.visualization.layout;
2
3 import java.awt.geom.Point2D;
4
5 import edu.uci.ics.jung.algorithms.layout.Layout;
6 import edu.uci.ics.jung.algorithms.layout.StaticLayout;
7 import edu.uci.ics.jung.algorithms.layout.util.Relaxer;
8 import edu.uci.ics.jung.algorithms.layout.util.VisRunner;
9 import edu.uci.ics.jung.algorithms.util.IterativeContext;
10 import edu.uci.ics.jung.graph.Graph;
11 import edu.uci.ics.jung.visualization.VisualizationViewer;
12
13 public class LayoutTransition<V,E> implements IterativeContext {
14
15 protected Layout<V,E> startLayout;
16 protected Layout<V,E> endLayout;
17 protected Layout<V,E> transitionLayout;
18 protected boolean done = false;
19 protected int count = 20;
20 protected int counter = 0;
21 protected VisualizationViewer<V,E> vv;
22
23 public LayoutTransition(VisualizationViewer<V,E> vv, Layout<V, E> startLayout, Layout<V, E> endLayout) {
24 this.vv = vv;
25 this.startLayout = startLayout;
26 this.endLayout = endLayout;
27 if(endLayout instanceof IterativeContext) {
28 Relaxer relaxer = new VisRunner((IterativeContext)endLayout);
29 relaxer.prerelax();
30 }
31 this.transitionLayout =
32 new StaticLayout<V,E>(startLayout.getGraph(), startLayout);
33 vv.setGraphLayout(transitionLayout);
34 }
35
36 public boolean done() {
37 return done;
38 }
39
40 public void step() {
41 Graph<V,E> g = transitionLayout.getGraph();
42 for(V v : g.getVertices()) {
43 Point2D tp = transitionLayout.apply(v);
44 Point2D fp = endLayout.apply(v);
45 double dx = (fp.getX()-tp.getX())/(count-counter);
46 double dy = (fp.getY()-tp.getY())/(count-counter);
47 transitionLayout.setLocation(v,
48 new Point2D.Double(tp.getX()+dx,tp.getY()+dy));
49 }
50 counter++;
51 if(counter >= count) {
52 done = true;
53 vv.setGraphLayout(endLayout);
54 }
55 vv.repaint();
56 }
57 }