public static Map computeLevels(Map vertexLevelMap, Digraph digraph, boolean longest) { if (vertexLevelMap == null) vertexLevelMap = new HashMap(digraph.order()); for (Iterator i = digraph.vertexIterator(); i.hasNext(); ) { Object rootCandidate = i.next(); if (digraph.incomingSize(rootCandidate) == 0) computeLevels(vertexLevelMap, digraph, rootCandidate, longest); } return vertexLevelMap; }
public static Map computeLevels(Map vertexLevelMap, DigraphIteration digraph, Object root, boolean longest) { if (vertexLevelMap == null) vertexLevelMap = new HashMap(); MutableInteger rootLevel = (MutableInteger)vertexLevelMap.get(root); if (rootLevel == null) { rootLevel = new MutableInteger(0); vertexLevelMap.put(root, rootLevel); } for (ArcIterator i = digraph.outgoingIterator(root); i.hasNext(); ) { i.next(); Object child = i.getDestination(); int childLevelCandidate = rootLevel.intValue()+1; MutableInteger childLevel = (MutableInteger)vertexLevelMap.get(child); if (childLevel == null) { childLevel = new MutableInteger(childLevelCandidate); vertexLevelMap.put(child, childLevel); computeLevels(vertexLevelMap, digraph, child, longest); } else if ((longest && childLevel.intValue() < childLevelCandidate) || (!longest && childLevel.intValue() > childLevelCandidate)) { childLevel.setValue(childLevelCandidate); computeLevels(vertexLevelMap, digraph, child, longest); } } return vertexLevelMap; }
public void doLayout() { // will operate on digraph of vertex wrappers instead of the original // digraph createWrapperDigraph(); // classify vertices by level (longest type) wrapperLevelMap = GraphUtils.computeLevels(new HashMap(wrapperDigraph .order()), wrapperDigraph, true); // shift vertices to leaves if possible // GraphUtils.shiftLevelsDown(vertexLevelMap, digraph); // split long arcs - make (k,2)partite digraph splitLongArcs(); // fill array of vertex levels createLevels(); // minimize number of arc intersections between each two levels // via barycentric method minimizeArcIntersections(); // adjust vertices horizontally to minimize arc lengths minimizeDistancesToBarycentres(); // finally, compute coordinates of vertices and arcs computeGeometry(); }