GEOS 3.2.1
|
00001 /********************************************************************** 00002 * $Id: SegmentNodeList.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 * Last port: noding/SegmentNodeList.java rev. 1.8 (JTS-1.10) 00017 * 00018 **********************************************************************/ 00019 00020 #ifndef GEOS_NODING_SEGMENTNODELIST_H 00021 #define GEOS_NODING_SEGMENTNODELIST_H 00022 00023 #include <geos/export.h> 00024 00025 #include <geos/inline.h> 00026 00027 #include <cassert> 00028 #include <iostream> 00029 #include <vector> 00030 #include <set> 00031 00032 #include <geos/noding/SegmentNode.h> // for composition 00033 00034 // Forward declarations 00035 namespace geos { 00036 namespace geom { 00037 class CoordinateSequence; 00038 } 00039 namespace noding { 00040 class SegmentString; 00041 class NodedSegmentString; 00042 } 00043 } 00044 00045 namespace geos { 00046 namespace noding { // geos::noding 00047 00052 class GEOS_DLL SegmentNodeList { 00053 private: 00054 std::set<SegmentNode*,SegmentNodeLT> nodeMap; 00055 00056 // the parent edge 00057 const NodedSegmentString& edge; 00058 00059 // This vector is here to keep track of created splitEdges 00060 std::vector<SegmentString*> splitEdges; 00061 00062 // This vector is here to keep track of created Coordinates 00063 std::vector<geom::CoordinateSequence*> splitCoordLists; 00064 00071 void checkSplitEdgesCorrectness(std::vector<SegmentString*>& splitEdges); 00072 00079 SegmentString* createSplitEdge(SegmentNode *ei0, SegmentNode *ei1); 00080 00089 void addCollapsedNodes(); 00090 00095 void findCollapsesFromExistingVertices( 00096 std::vector<size_t>& collapsedVertexIndexes); 00097 00105 void findCollapsesFromInsertedNodes( 00106 std::vector<size_t>& collapsedVertexIndexes); 00107 00108 bool findCollapseIndex(SegmentNode& ei0, SegmentNode& ei1, 00109 size_t& collapsedVertexIndex); 00110 00111 // Declare type as noncopyable 00112 SegmentNodeList(const SegmentNodeList& other); 00113 SegmentNodeList& operator=(const SegmentNodeList& rhs); 00114 00115 public: 00116 00117 friend std::ostream& operator<< (std::ostream& os, const SegmentNodeList& l); 00118 00119 typedef std::set<SegmentNode*,SegmentNodeLT> container; 00120 typedef container::iterator iterator; 00121 typedef container::const_iterator const_iterator; 00122 00123 SegmentNodeList(const NodedSegmentString* newEdge): edge(*newEdge) {} 00124 00125 SegmentNodeList(const NodedSegmentString& newEdge): edge(newEdge) {} 00126 00127 const NodedSegmentString& getEdge() const { return edge; } 00128 00129 // TODO: Is this a final class ? 00130 // Should remove the virtual in that case 00131 virtual ~SegmentNodeList(); 00132 00143 SegmentNode* add(const geom::Coordinate& intPt, size_t segmentIndex); 00144 00145 SegmentNode* add(const geom::Coordinate *intPt, size_t segmentIndex) { 00146 return add(*intPt, segmentIndex); 00147 } 00148 00149 /* 00150 * returns the set of SegmentNodes 00151 */ 00152 //replaces iterator() 00153 // TODO: obsolete this function 00154 std::set<SegmentNode*,SegmentNodeLT>* getNodes() { return &nodeMap; } 00155 00157 size_t size() const { return nodeMap.size(); } 00158 00159 container::iterator begin() { return nodeMap.begin(); } 00160 container::const_iterator begin() const { return nodeMap.begin(); } 00161 container::iterator end() { return nodeMap.end(); } 00162 container::const_iterator end() const { return nodeMap.end(); } 00163 00167 void addEndpoints(); 00168 00175 void addSplitEdges(std::vector<SegmentString*>& edgeList); 00176 00177 void addSplitEdges(std::vector<SegmentString*>* edgeList) { 00178 assert(edgeList); 00179 addSplitEdges(*edgeList); 00180 } 00181 00182 //string print(); 00183 }; 00184 00185 std::ostream& operator<< (std::ostream& os, const SegmentNodeList& l); 00186 00187 } // namespace geos::noding 00188 } // namespace geos 00189 00190 //#ifdef GEOS_INLINE 00191 //# include "geos/noding/SegmentNodeList.inl" 00192 //#endif 00193 00194 #endif 00195 00196 /********************************************************************** 00197 * $Log$ 00198 * Revision 1.4 2006/06/12 11:29:23 strk 00199 * unsigned int => size_t 00200 * 00201 * Revision 1.3 2006/05/04 07:41:56 strk 00202 * const-correct size() method for SegmentNodeList 00203 * 00204 * Revision 1.2 2006/03/24 09:52:41 strk 00205 * USE_INLINE => GEOS_INLINE 00206 * 00207 * Revision 1.1 2006/03/09 16:46:49 strk 00208 * geos::geom namespace definition, first pass at headers split 00209 * 00210 **********************************************************************/ 00211