Example #1
0
 protected GraphLayout doLayoutCopy(LayoutInfo patchInfo) {
   Graph graph = patchInfo.getGraph();
   final Map<Node, Integer> components = ConnectivityComponents.getComponents(graph);
   int numComponents = 0;
   for (Node node : ListSequence.fromList(graph.getNodes())) {
     numComponents = Math.max(numComponents, MapSequence.fromMap(components).get(node));
   }
   numComponents++;
   List<LayoutInfoCopier> copiers =
       ListSequence.fromList(new ArrayList<LayoutInfoCopier>(numComponents));
   List<GraphLayout> subgraphLayouts =
       ListSequence.fromList(new ArrayList<GraphLayout>(numComponents));
   for (int num = 0; num < numComponents; num++) {
     LayoutInfoCopier copier = new LayoutInfoCopier(patchInfo);
     ListSequence.fromList(copiers).addElement(copier);
     final int curComponent = num;
     copier.copySubgraph(
         new Filter<INode>() {
           public boolean accept(INode node) {
             Node myNode = ((Node) node);
             return (Integer) MapSequence.fromMap(components).get(myNode) == curComponent;
           }
         });
     LayoutInfo subgraphInfo = copier.getLayoutInfoCopy();
     ListSequence.fromList(subgraphLayouts).addElement(doLayoutConnectedGraph(subgraphInfo));
   }
   List<Rectangle> subgraphLayoutRects =
       ListSequence.fromList(new ArrayList<Rectangle>(numComponents));
   for (GraphLayout layout : ListSequence.fromList(subgraphLayouts)) {
     ListSequence.fromList(subgraphLayoutRects).addElement(layout.getContainingRectangle());
   }
   List<Dimension> subgraphLayoutShifts = getSubgraphLayoutShifts(subgraphLayoutRects);
   GraphLayout graphLayout = GraphLayoutFactory.createGraphLayout(graph);
   for (int num = 0; num < numComponents; num++) {
     LayoutInfoCopier copier = ListSequence.fromList(copiers).getElement(num);
     GraphLayout layout = ListSequence.fromList(subgraphLayouts).getElement(num);
     Dimension shift = ListSequence.fromList(subgraphLayoutShifts).getElement(num);
     for (INode node : SetSequence.fromSet(copier.getCopiedNodes())) {
       Rectangle rect = layout.getNodeLayout(copier.getNodeCopy(node));
       rect.translate(shift.width, shift.height);
       graphLayout.setLayoutFor(node, rect);
     }
     for (IEdge edge : SetSequence.fromSet(copier.getCopiedEdges())) {
       List<Point> path = layout.getEdgeLayout(copier.getEdgeCopy(edge));
       for (Point point : ListSequence.fromList(path)) {
         point.translate(shift.width, shift.height);
       }
       graphLayout.setLayoutFor(edge, path);
       if (SetSequence.fromSet(patchInfo.getLabeledEdges()).contains(edge)) {
         Rectangle rect = layout.getLabelLayout(copier.getEdgeCopy(edge));
         rect.translate(shift.width, shift.height);
         graphLayout.setLabelLayout(edge, rect);
       }
     }
   }
   return graphLayout;
 }
 public static void getRepresentation(
     EmbeddedGraph embeddedGraph,
     Set<Edge> edgesToBeStraight,
     Map<Dart, Integer> bends,
     Map<Dart, Integer> angles) {
   Graph graph = embeddedGraph.getGraph();
   Graph network = new Graph();
   Node center = network.createNode();
   Map<Edge, Integer> low = MapSequence.fromMap(new HashMap<Edge, Integer>());
   Map<Edge, Integer> capacity = MapSequence.fromMap(new HashMap<Edge, Integer>());
   Map<Edge, Integer> cost = MapSequence.fromMap(new HashMap<Edge, Integer>());
   Map<Node, Node> nodeMap = MapSequence.fromMap(new HashMap<Node, Node>());
   for (Node node : ListSequence.fromList(graph.getNodes())) {
     Node networkNode = network.createNode();
     MapSequence.fromMap(nodeMap).put(node, networkNode);
     Edge edge = network.connect(center, networkNode);
     MapSequence.fromMap(low).put(edge, 4);
     MapSequence.fromMap(capacity).put(edge, MapSequence.fromMap(low).get(edge));
     MapSequence.fromMap(cost).put(edge, 0);
   }
   Map<Face, Node> faceMap = MapSequence.fromMap(new HashMap<Face, Node>());
   for (Face face : ListSequence.fromList(embeddedGraph.getFaces())) {
     Node node = network.createNode();
     MapSequence.fromMap(faceMap).put(face, node);
     Edge edge = network.connect(node, center);
     if (embeddedGraph.isOuterFace(face)) {
       MapSequence.fromMap(low).put(edge, 2 * ListSequence.fromList(face.getDarts()).count() + 4);
     } else {
       MapSequence.fromMap(low).put(edge, 2 * ListSequence.fromList(face.getDarts()).count() - 4);
     }
     MapSequence.fromMap(capacity).put(edge, MapSequence.fromMap(low).get(edge));
     MapSequence.fromMap(cost).put(edge, 0);
   }
   Map<Dart, Edge> dartBendMap = MapSequence.fromMap(new HashMap<Dart, Edge>());
   Map<Dart, Edge> dartAngleMap = MapSequence.fromMap(new HashMap<Dart, Edge>());
   for (Face face : ListSequence.fromList(embeddedGraph.getFaces())) {
     Node faceNode = MapSequence.fromMap(faceMap).get(face);
     for (Dart dart : ListSequence.fromList(face.getDarts())) {
       Edge edge = network.connect(MapSequence.fromMap(nodeMap).get(dart.getSource()), faceNode);
       MapSequence.fromMap(dartAngleMap).put(dart, edge);
       MapSequence.fromMap(low).put(edge, 1);
       MapSequence.fromMap(capacity).put(edge, 4);
       MapSequence.fromMap(cost).put(edge, 0);
       List<Face> faces = embeddedGraph.getAdjacentFaces(dart.getEdge());
       Node oppositeFaceNode;
       if (ListSequence.fromList(faces).getElement(0) == face) {
         oppositeFaceNode =
             MapSequence.fromMap(faceMap).get(ListSequence.fromList(faces).getElement(1));
       } else {
         oppositeFaceNode =
             MapSequence.fromMap(faceMap).get(ListSequence.fromList(faces).getElement(0));
       }
       edge = network.connect(faceNode, oppositeFaceNode);
       MapSequence.fromMap(dartBendMap).put(dart, edge);
       MapSequence.fromMap(low).put(edge, 0);
       if (SetSequence.fromSet(edgesToBeStraight).contains(dart.getEdge())) {
         MapSequence.fromMap(capacity).put(edge, 0);
       } else {
         MapSequence.fromMap(capacity).put(edge, Integer.MAX_VALUE / 2);
       }
       MapSequence.fromMap(cost).put(edge, 1);
     }
   }
   if (SHOW_INFO > 0) {
     System.out.println("Constructed network:");
     for (Node node : ListSequence.fromList(graph.getNodes())) {
       System.out.println("for node " + node + ": " + MapSequence.fromMap(nodeMap).get(node));
     }
     for (Face face : ListSequence.fromList(embeddedGraph.getFaces())) {
       System.out.println("for face " + face + ": " + MapSequence.fromMap(faceMap).get(face));
     }
     for (Edge edge : ListSequence.fromList(network.getEdges())) {
       System.out.println(
           "edge "
               + edge
               + ": low = "
               + MapSequence.fromMap(low).get(edge)
               + ", cap = "
               + MapSequence.fromMap(capacity).get(edge)
               + ", cost = "
               + MapSequence.fromMap(cost).get(edge));
     }
   }
   Map<Edge, Integer> circulation =
       MinCostCirculation.getCirculation(network, low, capacity, cost);
   for (Dart dart : SetSequence.fromSet(MapSequence.fromMap(dartBendMap).keySet())) {
     MapSequence.fromMap(bends)
         .put(
             dart,
             MapSequence.fromMap(circulation).get(MapSequence.fromMap(dartBendMap).get(dart)));
     MapSequence.fromMap(angles)
         .put(
             dart,
             MapSequence.fromMap(circulation).get(MapSequence.fromMap(dartAngleMap).get(dart)));
   }
   if (SHOW_INFO > 0) {
     System.out.println("bends: " + bends);
     System.out.println("angles: " + angles);
   }
 }