00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef GEOS_NODING_NODEDSEGMENTSTRING_H
00024 #define GEOS_NODING_NODEDSEGMENTSTRING_H
00025
00026 #include <geos/export.h>
00027 #include <geos/noding/NodableSegmentString.h>
00028 #include <geos/geom/CoordinateSequence.h>
00029 #include <geos/algorithm/LineIntersector.h>
00030 #include <geos/noding/SegmentNode.h>
00031 #include <geos/noding/SegmentNodeList.h>
00032 #include <geos/noding/SegmentString.h>
00033
00034 #include <geos/geom/Coordinate.h>
00035
00036 #include <cstddef>
00037
00038 #ifdef _MSC_VER
00039 #pragma warning(push)
00040 #pragma warning(disable: 4251 4355) // warning C4355: 'this' : used in base member initializer list
00041 #endif
00042
00043 namespace geos {
00044 namespace noding {
00045
00058 class GEOS_DLL NodedSegmentString : public NodableSegmentString
00059 {
00060 public:
00061
00062 static void getNodedSubstrings(SegmentString::ConstVect* segStrings,
00063 SegmentString::NonConstVect* resultEdgelist)
00064 {
00065 for (ConstVect::size_type i=0, n=segStrings->size(); i<n; i++)
00066 {
00067 NodedSegmentString const* nss =
00068 static_cast<NodedSegmentString const*>((*segStrings)[i]);
00069
00070 const_cast<NodedSegmentString*>(nss)->getNodeList().addSplitEdges( resultEdgelist);
00071 }
00072 }
00073
00074 static void getNodedSubstrings(const SegmentString::NonConstVect& segStrings,
00075 SegmentString::NonConstVect* resultEdgeList);
00076
00078 static SegmentString::NonConstVect* getNodedSubstrings(
00079 const SegmentString::NonConstVect& segStrings);
00080
00081
00091 NodedSegmentString(geom::CoordinateSequence *newPts, const void* newContext)
00092 : NodableSegmentString(newContext)
00093 , nodeList(this)
00094 , pts(newPts)
00095 {}
00096
00097 ~NodedSegmentString()
00098 {}
00099
00109 SegmentNode* addIntersectionNode( geom::Coordinate * intPt, std::size_t segmentIndex)
00110 {
00111 std::size_t normalizedSegmentIndex = segmentIndex;
00112
00113
00114 std::size_t nextSegIndex = normalizedSegmentIndex + 1;
00115 if (nextSegIndex < size())
00116 {
00117 geom::Coordinate const& nextPt =
00118 getCoordinate(static_cast<unsigned int>(nextSegIndex));
00119
00120
00121
00122 if ( intPt->equals2D( nextPt ))
00123 {
00124 normalizedSegmentIndex = nextSegIndex;
00125 }
00126 }
00127
00128
00129 SegmentNode * ei = getNodeList().add( *intPt, normalizedSegmentIndex);
00130 return ei;
00131 }
00132
00133 SegmentNodeList& getNodeList();
00134
00135 const SegmentNodeList& getNodeList() const;
00136
00137 virtual unsigned int size() const
00138 {
00139 return static_cast<unsigned int>(pts->size());
00140 }
00141
00142 virtual const geom::Coordinate& getCoordinate(unsigned int i) const;
00143
00144 virtual geom::CoordinateSequence* getCoordinates() const;
00145
00146 virtual bool isClosed() const;
00147
00148 virtual std::ostream& print(std::ostream& os) const;
00149
00150
00158 int getSegmentOctant(unsigned int index) const;
00159
00165 void addIntersections(algorithm::LineIntersector *li,
00166 unsigned int segmentIndex, int geomIndex);
00167
00175 void addIntersection(algorithm::LineIntersector *li,
00176 unsigned int segmentIndex,
00177 int geomIndex, int intIndex);
00178
00186 void addIntersection(const geom::Coordinate& intPt,
00187 unsigned int segmentIndex);
00188
00189
00190 private:
00191
00192 SegmentNodeList nodeList;
00193
00194 geom::CoordinateSequence *pts;
00195
00196 static int safeOctant(const geom::Coordinate& p0, const geom::Coordinate& p1);
00197
00198 };
00199
00200 }
00201 }
00202
00203 #ifdef _MSC_VER
00204 #pragma warning(pop)
00205 #endif
00206
00207 #endif // GEOS_NODING_NODEDSEGMENTSTRING_H
00208
00209
00210
00211