00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef GEOS_GEOMGRAPH_EDGEENDSTAR_H
00023 #define GEOS_GEOMGRAPH_EDGEENDSTAR_H
00024
00025 #include <geos/export.h>
00026 #include <geos/geomgraph/EdgeEnd.h>
00027 #include <geos/geom/Coordinate.h>
00028
00029 #include <geos/inline.h>
00030
00031 #include <set>
00032 #include <string>
00033 #include <vector>
00034 #include <algorithm>
00035
00036
00037 namespace geos {
00038 namespace algorithm {
00039 class BoundaryNodeRule;
00040 }
00041 namespace geomgraph {
00042 class GeometryGraph;
00043 }
00044 }
00045
00046 namespace geos {
00047 namespace geomgraph {
00048
00049
00058 class GEOS_DLL EdgeEndStar {
00059 public:
00060
00061 typedef std::set<EdgeEnd *, EdgeEndLT> container;
00062
00063 typedef container::iterator iterator;
00064 typedef container::reverse_iterator reverse_iterator;
00065
00066 EdgeEndStar();
00067
00068 virtual ~EdgeEndStar() {};
00069
00073 virtual void insert(EdgeEnd *e)=0;
00074
00082 virtual geom::Coordinate& getCoordinate();
00083
00084 virtual size_t getDegree();
00085
00086 virtual iterator begin();
00087
00088 virtual iterator end();
00089
00090 virtual reverse_iterator rbegin();
00091
00092 virtual reverse_iterator rend();
00093
00094 virtual container &getEdges();
00095
00096
00097 virtual EdgeEnd* getNextCW(EdgeEnd *ee);
00098
00099 virtual void computeLabelling(std::vector<GeometryGraph*> *geomGraph);
00100
00101
00102 virtual bool isAreaLabelsConsistent(const GeometryGraph& geomGraph);
00103
00104 virtual void propagateSideLabels(int geomIndex);
00105
00106
00107
00108 virtual iterator find(EdgeEnd *eSearch);
00109
00110 virtual std::string print();
00111
00112 protected:
00113
00118 EdgeEndStar::container edgeMap;
00119
00123 virtual void insertEdgeEnd(EdgeEnd *e) { edgeMap.insert(e); }
00124
00125 private:
00126
00127 virtual int getLocation(int geomIndex,
00128 const geom::Coordinate& p,
00129 std::vector<GeometryGraph*> *geom);
00130
00135 int ptInAreaLocation[2];
00136
00137 virtual void computeEdgeEndLabels(const algorithm::BoundaryNodeRule&);
00138
00139 virtual bool checkAreaLabelsConsistent(int geomIndex);
00140
00141 };
00142
00143 inline size_t
00144 EdgeEndStar::getDegree()
00145 {
00146 return edgeMap.size();
00147 }
00148
00149 inline EdgeEndStar::iterator
00150 EdgeEndStar::begin()
00151 {
00152 return edgeMap.begin();
00153 }
00154
00155 inline EdgeEndStar::container&
00156 EdgeEndStar::getEdges()
00157 {
00158 return edgeMap;
00159 }
00160
00161 inline EdgeEndStar::reverse_iterator
00162 EdgeEndStar::rend()
00163 {
00164 return edgeMap.rend();
00165 }
00166
00167 inline EdgeEndStar::iterator
00168 EdgeEndStar::end()
00169 {
00170 return edgeMap.end();
00171 }
00172
00173 inline EdgeEndStar::reverse_iterator
00174 EdgeEndStar::rbegin()
00175 {
00176 return edgeMap.rbegin();
00177 }
00178
00179 inline EdgeEndStar::iterator
00180 EdgeEndStar::find(EdgeEnd *eSearch)
00181 {
00182 return edgeMap.find(eSearch);
00183 }
00184
00185
00186 }
00187 }
00188
00189
00190
00191
00192
00193 #endif // ifndef GEOS_GEOMGRAPH_EDGEENDSTAR_H
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210