DYT/Tool/OpenSceneGraph-3.6.5/include/geos/planargraph/PlanarGraph.h
2024-12-25 07:49:36 +08:00

294 lines
6.6 KiB
C++

/**********************************************************************
*
* GEOS - Geometry Engine Open Source
* http://geos.osgeo.org
*
* Copyright (C) 2005-2006 Refractions Research Inc.
*
* This is free software; you can redistribute and/or modify it under
* the terms of the GNU Lesser General Public Licence as published
* by the Free Software Foundation.
* See the COPYING file for more information.
*
**********************************************************************
*
* Last port: planargraph/PlanarGraph.java rev. 107/138 (JTS-1.10)
*
**********************************************************************/
#pragma once
#include <geos/export.h>
#include <geos/planargraph/NodeMap.h> // for composition
#include <vector> // for typedefs
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable: 4251) // warning C4251: needs to have dll-interface to be used by clients of class
#endif
// Forward declarations
namespace geos {
namespace geom {
class Coordinate;
}
namespace planargraph {
class DirectedEdge;
class Edge;
class Node;
}
}
namespace geos {
namespace planargraph { // geos.planargraph
/**
* \class PlanarGraph
* \brief
* Represents a directed graph which is embeddable in a planar surface.
*
* This class and the other classes in this package serve as a framework for
* building planar graphs for specific algorithms. This class must be
* subclassed to expose appropriate methods to construct the graph. This allows
* controlling the types of graph components (DirectedEdge, Edge and Node)
* which can be added to the graph. An application which uses the graph
* framework will almost always provide subclasses for one or more graph
* components, which hold application-specific data and graph algorithms.
*/
class GEOS_DLL PlanarGraph {
protected:
std::vector<Edge*> edges;
std::vector<DirectedEdge*> dirEdges;
NodeMap nodeMap;
/**
* \brief
* Adds a node to the std::map, replacing any that is already at that
* location.
*
* Only subclasses can add Nodes, to ensure Nodes are
* of the right type.
*/
void
add(Node* node)
{
nodeMap.add(node);
}
/**
* \brief
* Adds the Edge and its DirectedEdges with this PlanarGraph.
*
* Assumes that the Edge has already been created with its associated
* DirectEdges.
* Only subclasses can add Edges, to ensure the edges added are of
* the right class.
*/
void add(Edge* edge);
/**
* \brief
* Adds the Edge to this PlanarGraph.
*
* Only subclasses can add DirectedEdges,
* to ensure the edges added are of the right class.
*/
void
add(DirectedEdge* dirEdge)
{
dirEdges.push_back(dirEdge);
}
public:
typedef std::vector<Edge*> EdgeContainer;
typedef EdgeContainer::iterator EdgeIterator;
/**
* \brief
* Constructs a PlanarGraph without any Edges, DirectedEdges, or Nodes.
*/
PlanarGraph() {}
virtual
~PlanarGraph() {}
/**
* \brief
* Returns the Node at the given location,
* or null if no Node was there.
*/
Node*
findNode(const geom::Coordinate& pt)
{
return nodeMap.find(pt);
}
/**
* \brief
* Returns an Iterator over the Nodes in this PlanarGraph.
*/
NodeMap::container::iterator
nodeIterator()
{
return nodeMap.begin();
}
NodeMap::container::iterator
nodeBegin()
{
return nodeMap.begin();
}
NodeMap::container::const_iterator
nodeBegin() const
{
return nodeMap.begin();
}
NodeMap::container::iterator
nodeEnd()
{
return nodeMap.end();
}
NodeMap::container::const_iterator
nodeEnd() const
{
return nodeMap.end();
}
/**
* \brief
* Returns the Nodes in this PlanarGraph.
*
* @param nodes : the nodes are push_back'ed here
*/
void
getNodes(std::vector<Node*>& nodes)
{
nodeMap.getNodes(nodes);
}
/**
* \brief
* Returns an Iterator over the DirectedEdges in this PlanarGraph,
* in the order in which they were added.
*
* @see add(Edge)
* @see add(DirectedEdge)
*/
std::vector<DirectedEdge*>::iterator
dirEdgeIterator()
{
return dirEdges.begin();
}
std::vector<DirectedEdge*>::iterator
dirEdgeBegin()
{
return dirEdges.begin();
}
std::vector<DirectedEdge*>::iterator
dirEdgeEnd()
{
return dirEdges.end();
}
/// Alias for edgeBegin()
std::vector<Edge*>::iterator
edgeIterator()
{
return edges.begin();
}
/// Returns an iterator to first Edge in this graph.
//
/// Edges are stored in the order they were added.
/// @see add(Edge)
///
std::vector<Edge*>::iterator
edgeBegin()
{
return edges.begin();
}
/// Returns an iterator to one-past last Edge in this graph.
//
/// Edges are stored in the order they were added.
/// @see add(Edge)
///
std::vector<Edge*>::iterator
edgeEnd()
{
return edges.end();
}
/**
* Returns the Edges that have been added to this PlanarGraph
* @see PlanarGraph::add(Edge* edge)
*/
std::vector<Edge*>*
getEdges()
{
return &edges;
}
/**
* \brief
* Removes an Edge and its associated DirectedEdges from their
* from-Nodes and from this PlanarGraph.
*
* Note: This method does not remove the Nodes associated
* with the Edge, even if the removal of the Edge reduces the
* degree of a Node to zero.
*/
void remove(Edge* edge);
/**
* \brief
* Removes DirectedEdge from its from-Node and from this PlanarGraph.
*
* Note:
* This method does not remove the Nodes associated with the
* DirectedEdge, even if the removal of the DirectedEdge reduces
* the degree of a Node to zero.
*/
void remove(DirectedEdge* de);
/**
* \brief
* Removes a node from the graph, along with any associated
* DirectedEdges and Edges.
*/
void remove(Node* node);
/**
* \brief
* Returns all Nodes with the given number of Edges around it.
* The return value is a newly allocated vector of existing nodes
*/
std::vector<Node*>* findNodesOfDegree(std::size_t degree);
/**
* \brief
* Get all Nodes with the given number of Edges around it.
*
* Found nodes are pushed to the given vector
*/
void findNodesOfDegree(std::size_t degree, std::vector<Node*>& to);
};
} // namespace geos::planargraph
} // namespace geos
#ifdef _MSC_VER
#pragma warning(pop)
#endif