GEOS 3.2.2
|
00001 /********************************************************************** 00002 * $Id: NodedSegmentString.h 2778 2009-12-03 19:44:00Z mloskot $ 00003 * 00004 * GEOS - Geometry Engine Open Source 00005 * http://geos.refractions.net 00006 * 00007 * Copyright (C) 2006 Refractions Research Inc. 00008 * 00009 * This is free software; you can redistribute and/or modify it under 00010 * the terms of the GNU Lesser General Public Licence as published 00011 * by the Free Software Foundation. 00012 * See the COPYING file for more information. 00013 * 00014 * 00015 ********************************************************************** 00016 * 00017 * Last port: noding/NodedSegmentString.java rev. 1.2 (JTS-1.9) 00018 * 00019 **********************************************************************/ 00020 00021 #ifndef GEOS_NODING_NODEDSEGMENTSTRING_H 00022 #define GEOS_NODING_NODEDSEGMENTSTRING_H 00023 00024 #include <geos/noding/NodableSegmentString.h> // for inheritance 00025 #include <geos/geom/CoordinateSequence.h> // for inlines 00026 #include <geos/algorithm/LineIntersector.h> 00027 #include <geos/noding/SegmentNode.h> 00028 #include <geos/noding/SegmentNodeList.h> 00029 #include <geos/noding/SegmentString.h> 00030 //#include <geos/noding/Octant.h> 00031 #include <geos/geom/Coordinate.h> 00032 00033 #ifdef _MSC_VER 00034 #pragma warning(push) 00035 #pragma warning(disable: 4355) // warning C4355: 'this' : used in base member initializer list 00036 #endif 00037 00038 namespace geos { 00039 namespace noding { // geos::noding 00040 00053 class NodedSegmentString : public NodableSegmentString 00054 { 00055 public: 00056 00057 static void getNodedSubstrings(SegmentString::ConstVect* segStrings, 00058 SegmentString::NonConstVect* resultEdgelist) 00059 { 00060 for (size_t i=0, n=segStrings->size(); i<n; i++) 00061 { 00062 NodedSegmentString * nss = (NodedSegmentString *)((*segStrings)[i]); 00063 nss->getNodeList().addSplitEdges( resultEdgelist); 00064 } 00065 } 00066 00067 static void getNodedSubstrings( 00068 const SegmentString::NonConstVect& segStrings, 00069 SegmentString::NonConstVect* resultEdgeList); 00070 00072 static SegmentString::NonConstVect* getNodedSubstrings( 00073 const SegmentString::NonConstVect& segStrings); 00074 00075 00085 NodedSegmentString(geom::CoordinateSequence *newPts, 00086 const void* newContext) 00087 : 00088 NodableSegmentString(newContext), 00089 nodeList(this), 00090 pts(newPts) 00091 { } 00092 00093 ~NodedSegmentString() 00094 { } 00095 00105 SegmentNode * addIntersectionNode( geom::Coordinate * intPt, size_t segmentIndex) 00106 { 00107 size_t normalizedSegmentIndex = segmentIndex; 00108 00109 // normalize the intersection point location 00110 size_t nextSegIndex = normalizedSegmentIndex + 1; 00111 if (nextSegIndex < size()) 00112 { 00113 const geom::Coordinate &nextPt = getCoordinate( nextSegIndex); 00114 00115 // Normalize segment index if intPt falls on vertex 00116 // The check for point equality is 2D only - Z values are ignored 00117 if ( intPt->equals2D( nextPt )) 00118 { 00119 normalizedSegmentIndex = nextSegIndex; 00120 } 00121 } 00122 00123 // Add the intersection point to edge intersection list. 00124 SegmentNode * ei = getNodeList().add( *intPt, normalizedSegmentIndex); 00125 return ei; 00126 } 00127 00128 SegmentNodeList& getNodeList(); 00129 00130 const SegmentNodeList& getNodeList() const; 00131 00132 virtual unsigned int size() const 00133 { 00134 return pts->size(); 00135 } 00136 00137 virtual const geom::Coordinate& getCoordinate(unsigned int i) const; 00138 00139 virtual geom::CoordinateSequence* getCoordinates() const; 00140 00141 virtual bool isClosed() const; 00142 00143 virtual std::ostream& print(std::ostream& os) const; 00144 00145 00153 int getSegmentOctant(unsigned int index) const; 00154 00160 void addIntersections(algorithm::LineIntersector *li, 00161 unsigned int segmentIndex, int geomIndex); 00162 00170 void addIntersection(algorithm::LineIntersector *li, 00171 unsigned int segmentIndex, 00172 int geomIndex, int intIndex); 00173 00181 void addIntersection(const geom::Coordinate& intPt, 00182 unsigned int segmentIndex); 00183 00184 00185 private: 00186 00187 SegmentNodeList nodeList; 00188 00189 geom::CoordinateSequence *pts; 00190 00191 }; 00192 00193 } // namespace geos::noding 00194 } // namespace geos 00195 00196 #ifdef _MSC_VER 00197 #pragma warning(pop) 00198 #endif 00199 00200 #endif // GEOS_NODING_NODEDSEGMENTSTRING_H 00201 /********************************************************************** 00202 * $Log$ 00203 **********************************************************************/ 00204