/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2002-2008, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotools.graph.structure; import java.util.Collection; import java.util.List; /** * * Represents a graph. * * A graph is a collection of nodes (verticies) connected by links called * edges (arcs). <BR> * <BR> * In most applications nodes of a graph represent the * objects being modelled, and the edges represent the * relationships between the objects. An example could be a polygon coverage in * which one wishes to model a boundary sharing relationship. The following is * an illustration.<BR> * <BR> * <IMG src="doc-files/poly_coverage.gif"><BR> * <BR> * In the above figure, the objects (nodes) are the polygons themselves, and the * relationship (edges) between them is boundary sharing.<BR> * <BR> * However, there exists types of graphs in which the roles are reversed and the * edges are the objects, and the nodes are the relationships. An example of * such a graph is the stream network shown below.<BR> * <BR> * <IMG src="doc-files/stream_network.gif"><BR> * <BR> * In the above figure, the objects (edges) are the stream segments and the * relationship (nodes) between them is endpoint sharing. However, if * desirable one could model the second case similar to the first. The * resulting graph is shown below.<BR> * <BR> * <IMG src="doc-files/stream_network2.gif"><BR> * <BR> * The Graph object is intended to serve as a container for a collection * of nodes and edges. It does dont define or manage the relationship among the * components it contains. * * @see Node * @see Edge * * @author Justin Deoliveira, Refractions Research Inc, jdeolive@refractions.net * * * @source $URL$ */ public interface Graph { /** * Signal to indicate that a graph component meets the requirements of a * query against a graph and that the query should continue. */ public static final int PASS_AND_CONTINUE = 1; /** * Signal to indicate that a graph component meets the requirements of a * query against a graph and that the query should end. */ public static final int PASS_AND_STOP = 2; /** * Signal to indicate that a graph component does NOT meet the requirements * of a query made against the graph. */ public static final int FAIL_QUERY = 0; /** * Returns the nodes of the graph. * * @return A collection of Node objects. * * @see Node */ public Collection getNodes(); /** * Returns the edges of the graph. * * @return A collection of Edge objects. * * @see Edge */ public Collection getEdges(); /** * Performs a query against the nodes of the graph. Each Node object * contained in the graph is passed to a GraphVisitor to determine if it * meets the query criteria. * * @param visitor Determines if node meets query criteria. * Returns MEET_AND_CONTINUE to signal that the node meets the query criteria * and the query should continue.<BR> * Returns MEET_AND_STOP to signal that the node meest the query criteria and * the query should stop.<BR> * FAIL_QUERY to signal that the node does NOT meet the query criteria. * * @return A collection of nodes that meet the query criteria. * * @see Node * @see GraphVisitor */ public List queryNodes(GraphVisitor visitor); /** * Performs a query against the edges of the graph. Each Edge object * contained in the graph is passed to a GraphVisitor to determine if it * meets the query criteria. * * @param visitor Determines if the meets the query criteria. <BR> * Returns MEET_AND_CONTINUE to signal that the edge meets the query criteria * and the query should continue.<BR> * Returns MEET_AND_STOP to signal that the edge meest the query criteria and * the query should stop.<BR> * FAIL_QUERY to signal that the edge does NOT meet the query criteria. * * @return A collection of edges that meet the query criteria. * * @see Edge * @see GraphVisitor */ public List queryEdges(GraphVisitor visitor); /** * Applies the visitor pattern to the nodes of the graph. * * @param visitor */ public void visitNodes(GraphVisitor visitor); /** * Applies the visitor pattern to the edges of the graph. * * @param visitor */ public void visitEdges(GraphVisitor visitor); /** * Returns all the nodes in the graph of a specified degree. The degree of * a node is the number of edges that are adjacent to the node. * * @param n The desired degree of nodes to be returned. * * @return A collection of nodes of degree n. * * @see Node#getDegree() */ public List getNodesOfDegree(int n); /** * Returns all the nodes in the graph that have been marked as visited or * non-visited. * * @param visited True if node is visited, false if node is unvisited. * * @return List of nodes marked as visited / non-visited. * * @see Graphable#isVisited() */ public List getVisitedNodes(boolean visited); /** * Returns all the edges in the graph that have been marked as visited or * non-visited. * * @param visited True if edge is visited, false if edge is unvisited. * * @return List of edges marked as visited / non-visited. * * @see Graphable#isVisited() */ public List getVisitedEdges(boolean visited); }