00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef GEOS_GEOMGRAPH_PLANARGRAPH_H
00022 #define GEOS_GEOMGRAPH_PLANARGRAPH_H
00023
00024 #include <geos/export.h>
00025 #include <map>
00026 #include <vector>
00027 #include <memory>
00028
00029 #include <geos/geom/Coordinate.h>
00030 #include <geos/geomgraph/PlanarGraph.h>
00031 #include <geos/geomgraph/NodeMap.h>
00032 #include <geos/geomgraph/DirectedEdgeStar.h>
00033
00034 #include <geos/inline.h>
00035
00036
00037 namespace geos {
00038 namespace geom {
00039 class Coordinate;
00040 }
00041 namespace geomgraph {
00042 class Edge;
00043 class Node;
00044 class EdgeEnd;
00045 class NodeFactory;
00046 }
00047 }
00048
00049 namespace geos {
00050 namespace geomgraph {
00051
00075 class GEOS_DLL PlanarGraph {
00076 public:
00077
00086 template <typename It>
00087 static void linkResultDirectedEdges(It first, It last)
00088
00089 {
00090 for ( ; first!=last; ++first )
00091 {
00092 Node *node=*first;
00093 assert(node);
00094
00095 EdgeEndStar* ees = node->getEdges();
00096 assert(ees);
00097 DirectedEdgeStar* des = dynamic_cast<DirectedEdgeStar*>(ees);
00098 assert(des);
00099
00100
00101 des->linkResultDirectedEdges();
00102 }
00103 }
00104
00105 PlanarGraph(const NodeFactory &nodeFact);
00106
00107 PlanarGraph();
00108
00109 virtual ~PlanarGraph();
00110
00111 virtual std::vector<Edge*>::iterator getEdgeIterator();
00112
00113 virtual std::vector<EdgeEnd*>* getEdgeEnds();
00114
00115 virtual bool isBoundaryNode(int geomIndex, const geom::Coordinate& coord);
00116
00117 virtual void add(EdgeEnd *e);
00118
00119 virtual NodeMap::iterator getNodeIterator();
00120
00121 virtual void getNodes(std::vector<Node*>&);
00122
00123 virtual Node* addNode(Node *node);
00124
00125 virtual Node* addNode(const geom::Coordinate& coord);
00126
00130 virtual Node* find(geom::Coordinate& coord);
00131
00136 virtual void addEdges(const std::vector<Edge*> &edgesToAdd);
00137
00138 virtual void linkResultDirectedEdges();
00139
00140 virtual void linkAllDirectedEdges();
00141
00149 virtual EdgeEnd* findEdgeEnd(Edge *e);
00150
00157 virtual Edge* findEdge(const geom::Coordinate& p0,
00158 const geom::Coordinate& p1);
00159
00167 virtual Edge* findEdgeInSameDirection(const geom::Coordinate& p0,
00168 const geom::Coordinate& p1);
00169
00170 virtual std::string printEdges();
00171
00172 virtual NodeMap* getNodeMap();
00173
00174 protected:
00175
00176 std::vector<Edge*> *edges;
00177
00178 NodeMap *nodes;
00179
00180 std::vector<EdgeEnd*> *edgeEndList;
00181
00182 virtual void insertEdge(Edge *e);
00183
00184 private:
00185
00193 bool matchInSameDirection(const geom::Coordinate& p0,
00194 const geom::Coordinate& p1,
00195 const geom::Coordinate& ep0,
00196 const geom::Coordinate& ep1);
00197 };
00198
00199
00200
00201 }
00202 }
00203
00204
00205
00206
00207
00208 #endif // ifndef GEOS_GEOMGRAPH_PLANARGRAPH_H
00209