public void step() {
    synchronized (vv.getGraphLayout()) {
      Graph<V, E> g = endLayout.getGraph();
      for (V v : g.getVertices()) {
        Point2D tp = transitionLayout.transform(v);
        if (tp == null) tp = new Point2D.Double(0, 0);
        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;
        // ((RelVisualizationModel)vv.getModel()).setRelaxer(relaxer);
        ((RelVisualizationModel) vv.getModel()).setAnimatorGraphLayout(endLayout);
      }
      vv.repaint();
    }
  }
  public RelLayoutTransition(
      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 = new RelVisRunner((IterativeContext) endLayout);
      relaxer.prerelax();
      relaxer.relax();
    }
    this.transitionLayout = new RelStaticLayout<V, E>(startLayout.getGraph(), startLayout);
    vv.setGraphLayout(transitionLayout);
  }