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/geomgraph/EdgeEnd.h>
00026 #include <geos/geom/Coordinate.h>
00027
00028 #include <geos/inline.h>
00029
00030 #include <set>
00031 #include <string>
00032 #include <vector>
00033 #include <algorithm>
00034
00035
00036 namespace geos {
00037 namespace geomgraph {
00038 class GeometryGraph;
00039 }
00040 }
00041
00042 namespace geos {
00043 namespace geomgraph {
00044
00045
00054 class EdgeEndStar {
00055 public:
00056
00057 typedef std::set<EdgeEnd *, EdgeEndLT> container;
00058
00059 typedef container::iterator iterator;
00060 typedef container::reverse_iterator reverse_iterator;
00061
00062 EdgeEndStar();
00063
00064 virtual ~EdgeEndStar() {};
00065
00069 virtual void insert(EdgeEnd *e)=0;
00070
00078 virtual geom::Coordinate& getCoordinate();
00079
00080 virtual size_t getDegree();
00081
00082 virtual iterator begin();
00083
00084 virtual iterator end();
00085
00086 virtual reverse_iterator rbegin();
00087
00088 virtual reverse_iterator rend();
00089
00090 virtual container &getEdges();
00091
00092
00093 virtual EdgeEnd* getNextCW(EdgeEnd *ee);
00094
00095 virtual void computeLabelling(std::vector<GeometryGraph*> *geom);
00096
00097
00098 virtual int getLocation(int geomIndex,
00099 const geom::Coordinate& p,
00100 std::vector<GeometryGraph*> *geom);
00101
00102 virtual bool isAreaLabelsConsistent();
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
00131 int ptInAreaLocation[2];
00132
00133 virtual void computeEdgeEndLabels();
00134
00135 virtual bool checkAreaLabelsConsistent(int geomIndex);
00136
00137 };
00138
00139 inline size_t
00140 EdgeEndStar::getDegree()
00141 {
00142 return edgeMap.size();
00143 }
00144
00145 inline EdgeEndStar::iterator
00146 EdgeEndStar::begin()
00147 {
00148 return edgeMap.begin();
00149 }
00150
00151 inline EdgeEndStar::container&
00152 EdgeEndStar::getEdges()
00153 {
00154 return edgeMap;
00155 }
00156
00157 inline EdgeEndStar::reverse_iterator
00158 EdgeEndStar::rend()
00159 {
00160 return edgeMap.rend();
00161 }
00162
00163 inline EdgeEndStar::iterator
00164 EdgeEndStar::end()
00165 {
00166 return edgeMap.end();
00167 }
00168
00169 inline EdgeEndStar::reverse_iterator
00170 EdgeEndStar::rbegin()
00171 {
00172 return edgeMap.rbegin();
00173 }
00174
00175 inline EdgeEndStar::iterator
00176 EdgeEndStar::find(EdgeEnd *eSearch)
00177 {
00178 return edgeMap.find(eSearch);
00179 }
00180
00181
00182 }
00183 }
00184
00185
00186
00187
00188
00189 #endif // ifndef GEOS_GEOMGRAPH_EDGEENDSTAR_H
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206