/** * Returns the {@link DirectedEdge} that starts from the given node, or null if the * node is not one of the two nodes associated with this Edge. */ public DirectedEdge getDirEdge(Node fromNode) { if (dirEdge[0].getFromNode() == fromNode) return dirEdge[0]; if (dirEdge[1].getFromNode() == fromNode) return dirEdge[1]; // node not found // possibly should throw an exception here? return null; }
/** * If <code>node</code> is one of the two nodes associated with this Edge, * returns the other node; otherwise returns null. */ public Node getOppositeNode(Node node) { if (dirEdge[0].getFromNode() == node) return dirEdge[0].getToNode(); if (dirEdge[1].getFromNode() == node) return dirEdge[1].getToNode(); // node not found // possibly should throw an exception here? return null; }
/** * Adds an {@link Edge} to the subgraph. * The associated {@link DirectedEdge}s and {@link Node}s * are also added. * * @param e the edge to add */ public void add(Edge e) { if (edges.contains(e)) return; edges.add(e); dirEdges.add(e.getDirEdge(0)); dirEdges.add(e.getDirEdge(1)); nodeMap.add(e.getDirEdge(0).getFromNode()); nodeMap.add(e.getDirEdge(1).getFromNode()); }
public List getConnectedSubgraphs() { List subgraphs = new ArrayList(); GraphComponent.setVisited(graph.nodeIterator(), false); for (Iterator i = graph.edgeIterator(); i.hasNext(); ) { Edge e = (Edge) i.next(); Node node = e.getDirEdge(0).getFromNode(); if (! node.isVisited()) { subgraphs.add(findSubgraph(node)); } } return subgraphs; }
/** * Removes a {@link DirectedEdge} from its from-{@link Node} and from this graph. * This method does not remove the {@link Node}s associated with the DirectedEdge, * even if the removal of the DirectedEdge reduces the degree of a Node to zero. */ public void remove(DirectedEdge de) { DirectedEdge sym = de.getSym(); if (sym != null) sym.setSym(null); de.getFromNode().remove(de); de.remove(); dirEdges.remove(de); }
/** * Initializes this Edge's two DirectedEdges, and for each DirectedEdge: sets the * Edge, sets the symmetric DirectedEdge, and adds this Edge to its from-Node. */ public void setDirectedEdges(DirectedEdge de0, DirectedEdge de1) { dirEdge = new DirectedEdge[] { de0, de1 }; de0.setEdge(this); de1.setEdge(this); de0.setSym(de1); de1.setSym(de0); de0.getFromNode().addOutEdge(de0); de1.getFromNode().addOutEdge(de1); }
Node startNode = startEdge.getFromNode(); Node endNode = endEdge.getToNode(); flipSeq = true; if (startEdge.getFromNode().getDegree() == 1 && startEdge.getEdgeDirection() == true) { hasObviousStartNode = true; flipSeq = false; if (startEdge.getFromNode().getDegree() == 1) flipSeq = true;
private List findSequence(Subgraph graph) { GraphComponent.setVisited(graph.edgeIterator(), false); Node startNode = findLowestDegreeNode(graph); DirectedEdge startDE = (DirectedEdge) startNode.getOutEdges().iterator().next(); DirectedEdge startDESym = startDE.getSym(); List seq = new LinkedList(); ListIterator lit = seq.listIterator(); addReverseSubpath(startDESym, lit, false); while (lit.hasPrevious()) { DirectedEdge prev = (DirectedEdge) lit.previous(); DirectedEdge unvisitedOutDE = findUnvisitedBestOrientedDE(prev.getFromNode()); if (unvisitedOutDE != null) addReverseSubpath(unvisitedOutDE.getSym(), lit, true); } /** * At this point, we have a valid sequence of graph DirectedEdges, but it * is not necessarily appropriately oriented relative to the underlying * geometry. */ List orientedSeq = orient(seq); return orientedSeq; }
private void addReverseSubpath(DirectedEdge de, ListIterator lit, boolean expectedClosed) { // trace an unvisited path *backwards* from this de Node endNode = de.getToNode(); Node fromNode = null; while (true) { lit.add(de.getSym()); de.getEdge().setVisited(true); fromNode = de.getFromNode(); DirectedEdge unvisitedOutDE = findUnvisitedBestOrientedDE(fromNode); // this must terminate, since we are continually marking edges as visited if (unvisitedOutDE == null) break; de = unvisitedOutDE.getSym(); } if (expectedClosed) { // the path should end at the toNode of this de, otherwise we have an error Assert.isTrue(fromNode == endNode, "path not contiguous"); } }
/** * Returns the {@link DirectedEdge} that starts from the given node, or null if the * node is not one of the two nodes associated with this Edge. */ public DirectedEdge getDirEdge(Node fromNode) { if (dirEdge[0].getFromNode() == fromNode) return dirEdge[0]; if (dirEdge[1].getFromNode() == fromNode) return dirEdge[1]; // node not found // possibly should throw an exception here? return null; }
/** * If <code>node</code> is one of the two nodes associated with this Edge, * returns the other node; otherwise returns null. */ public Node getOppositeNode(Node node) { if (dirEdge[0].getFromNode() == node) return dirEdge[0].getToNode(); if (dirEdge[1].getFromNode() == node) return dirEdge[1].getToNode(); // node not found // possibly should throw an exception here? return null; }
/** * Adds an {@link Edge} to the subgraph. * The associated {@link DirectedEdge}s and {@link Node}s * are also added. * * @param e the edge to add */ public void add(Edge e) { if (edges.contains(e)) return; edges.add(e); dirEdges.add(e.getDirEdge(0)); dirEdges.add(e.getDirEdge(1)); nodeMap.add(e.getDirEdge(0).getFromNode()); nodeMap.add(e.getDirEdge(1).getFromNode()); }
public List getConnectedSubgraphs() { List subgraphs = new ArrayList(); GraphComponent.setVisited(graph.nodeIterator(), false); for (Iterator i = graph.edgeIterator(); i.hasNext(); ) { Edge e = (Edge) i.next(); Node node = e.getDirEdge(0).getFromNode(); if (! node.isVisited()) { subgraphs.add(findSubgraph(node)); } } return subgraphs; }
/** * Removes a {@link DirectedEdge} from its from-{@link Node} and from this graph. * This method does not remove the {@link Node}s associated with the DirectedEdge, * even if the removal of the DirectedEdge reduces the degree of a Node to zero. */ public void remove(DirectedEdge de) { DirectedEdge sym = de.getSym(); if (sym != null) sym.setSym(null); de.getFromNode().remove(de); de.remove(); dirEdges.remove(de); }
/** * Initializes this Edge's two DirectedEdges, and for each DirectedEdge: sets the * Edge, sets the symmetric DirectedEdge, and adds this Edge to its from-Node. */ public void setDirectedEdges(DirectedEdge de0, DirectedEdge de1) { dirEdge = new DirectedEdge[] { de0, de1 }; de0.setEdge(this); de1.setEdge(this); de0.setSym(de1); de1.setSym(de0); de0.getFromNode().addOutEdge(de0); de1.getFromNode().addOutEdge(de1); }
Node startNode = startEdge.getFromNode(); Node endNode = endEdge.getToNode(); flipSeq = true; if (startEdge.getFromNode().getDegree() == 1 && startEdge.getEdgeDirection() == true) { hasObviousStartNode = true; flipSeq = false; if (startEdge.getFromNode().getDegree() == 1) flipSeq = true;
private List findSequence(Subgraph graph) { GraphComponent.setVisited(graph.edgeIterator(), false); Node startNode = findLowestDegreeNode(graph); DirectedEdge startDE = (DirectedEdge) startNode.getOutEdges().iterator().next(); DirectedEdge startDESym = startDE.getSym(); List seq = new LinkedList(); ListIterator lit = seq.listIterator(); addReverseSubpath(startDESym, lit, false); while (lit.hasPrevious()) { DirectedEdge prev = (DirectedEdge) lit.previous(); DirectedEdge unvisitedOutDE = findUnvisitedBestOrientedDE(prev.getFromNode()); if (unvisitedOutDE != null) addReverseSubpath(unvisitedOutDE.getSym(), lit, true); } /** * At this point, we have a valid sequence of graph DirectedEdges, but it * is not necessarily appropriately oriented relative to the underlying * geometry. */ List orientedSeq = orient(seq); return orientedSeq; }
private void addReverseSubpath(DirectedEdge de, ListIterator lit, boolean expectedClosed) { // trace an unvisited path *backwards* from this de Node endNode = de.getToNode(); Node fromNode = null; while (true) { lit.add(de.getSym()); de.getEdge().setVisited(true); fromNode = de.getFromNode(); DirectedEdge unvisitedOutDE = findUnvisitedBestOrientedDE(fromNode); // this must terminate, since we are continually marking edges as visited if (unvisitedOutDE == null) break; de = unvisitedOutDE.getSym(); } if (expectedClosed) { // the path should end at the toNode of this de, otherwise we have an error Assert.isTrue(fromNode == endNode, "path not contiguous"); } }