View Javadoc
1   package edu.uci.ics.jung.visualization.layout;
2   
3   import java.awt.Shape;
4   import java.awt.geom.AffineTransform;
5   import java.awt.geom.Point2D;
6   import java.awt.geom.Rectangle2D;
7   import java.util.ArrayList;
8   import java.util.List;
9   
10  import edu.uci.ics.jung.algorithms.layout.Layout;
11  import edu.uci.ics.jung.graph.Graph;
12  import edu.uci.ics.jung.graph.util.Pair;
13  import edu.uci.ics.jung.visualization.RenderContext;
14  
15  public class BoundingRectangleCollector<V,E>  {
16  
17  	protected RenderContext<V,E> rc;
18  	protected Graph<V,E> graph;
19  	protected Layout<V,E> layout;
20  	protected List<Rectangle2D> rectangles = new ArrayList<Rectangle2D>();
21  	
22  	public BoundingRectangleCollector(RenderContext<V, E> rc, Layout<V, E> layout) {
23  		this.rc = rc;
24  		this.layout = layout;
25  		this.graph = layout.getGraph();
26  		compute();
27  	}
28  
29  	/**
30  	 * @return the rectangles
31  	 */
32  	public List<Rectangle2D> getRectangles() {
33  		return rectangles;
34  	}
35  
36  	public void compute() {
37  		rectangles.clear();
38  //		Graphics2D g2d = (Graphics2D)g;
39  //		g.setColor(Color.cyan);
40  
41  		for(E e : graph.getEdges()) {
42  			Pair<V> endpoints = graph.getEndpoints(e);
43  			V v1 = endpoints.getFirst();
44  			V v2 = endpoints.getSecond();
45  			Point2D p1 = layout.apply(v1);
46  			Point2D p2 = layout.apply(v2);
47  			float x1 = (float)p1.getX();
48  			float y1 = (float)p1.getY();
49  			float x2 = (float)p2.getX();
50  			float y2 = (float)p2.getY();
51  			
52  			boolean isLoop = v1.equals(v2);
53  			Shape s2 = rc.getVertexShapeTransformer().apply(v2);
54  			Shape edgeShape = rc.getEdgeShapeTransformer().apply(e);
55  
56  			AffineTransform xform = AffineTransform.getTranslateInstance(x1,y1);
57  			
58  			if(isLoop) {
59  				Rectangle2D s2Bounds = s2.getBounds2D();
60  				xform.scale(s2Bounds.getWidth(), s2Bounds.getHeight());
61  				xform.translate(0, -edgeShape.getBounds2D().getWidth()/2);
62  			} else {
63  				float dx = x2-x1;
64  				float dy = y2-y1;
65  				float theta = (float)Math.atan2(dy,dx);
66  				xform.rotate(theta);
67  				float dist = (float)p1.distance(p2);
68  				xform.scale(dist, 1.0);
69  			}
70  			edgeShape = xform.createTransformedShape(edgeShape);
71  //			edgeShape = rc.getMultiLayerTransformer().transform(Layer.LAYOUT, edgeShape);
72  			rectangles.add(edgeShape.getBounds2D());
73  		}
74  		
75  		for(V v : graph.getVertices()) {
76  			Shape shape = rc.getVertexShapeTransformer().apply(v);
77  			Point2D p = layout.apply(v);
78  //			p = rc.getMultiLayerTransformer().transform(Layer.LAYOUT, p);
79  			float x = (float)p.getX();
80  			float y = (float)p.getY();
81  			AffineTransform xform = AffineTransform.getTranslateInstance(x, y);
82  			shape = xform.createTransformedShape(shape);
83  			rectangles.add(shape.getBounds2D());
84  		}
85  	}
86  }