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
31
32 public List<Rectangle2D> getRectangles() {
33 return rectangles;
34 }
35
36 public void compute() {
37 rectangles.clear();
38
39
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
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
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 }