GEOS  3.8.0
EdgeIntersectionList.h
1 /**********************************************************************
2  *
3  * GEOS - Geometry Engine Open Source
4  * http://geos.osgeo.org
5  *
6  * Copyright (C) 2011 Sandro Santilli <strk@kbt.io>
7  * Copyright (C) 2005-2006 Refractions Research Inc.
8  * Copyright (C) 2001-2002 Vivid Solutions Inc.
9  *
10  * This is free software; you can redistribute and/or modify it under
11  * the terms of the GNU Lesser General Public Licence as published
12  * by the Free Software Foundation.
13  * See the COPYING file for more information.
14  *
15  **********************************************************************
16  *
17  * Last port: geomgraph/EdgeIntersectionList.java r428 (JTS-1.12+)
18  *
19  **********************************************************************/
20 
21 
22 #ifndef GEOS_GEOMGRAPH_EDGEINTERSECTIONLIST_H
23 #define GEOS_GEOMGRAPH_EDGEINTERSECTIONLIST_H
24 
25 #include <geos/export.h>
26 #include <algorithm>
27 #include <vector>
28 #include <string>
29 
30 #include <geos/geomgraph/EdgeIntersection.h> // for EdgeIntersectionLessThen
31 #include <geos/geom/Coordinate.h> // for CoordinateLessThen
32 
33 #include <geos/inline.h>
34 
35 #ifdef _MSC_VER
36 #pragma warning(push)
37 #pragma warning(disable: 4251) // warning C4251: needs to have dll-interface to be used by clients of class
38 #endif
39 
40 // Forward declarations
41 namespace geos {
42 namespace geom {
43 class Coordinate;
44 }
45 namespace geomgraph {
46 class Edge;
47 }
48 }
49 
50 namespace geos {
51 namespace geomgraph { // geos.geomgraph
52 
53 
59 class GEOS_DLL EdgeIntersectionList {
60 public:
61  // Instead of storing edge intersections in a set, as JTS does, we store them
62  // in a vector and then sort the vector if needed before iterating among the
63  // edges. This is much faster.
64  using container = std::vector<EdgeIntersection>;
65  using const_iterator = container::const_iterator;
66 
67 private:
68  mutable container nodeMap;
69  mutable bool sorted;
70 
71 public:
72 
73  const Edge* edge;
74  EdgeIntersectionList(const Edge* edge);
75  ~EdgeIntersectionList() = default;
76 
77  /*
78  * Adds an intersection into the list, if it isn't already there.
79  * The input segmentIndex and dist are expected to be normalized.
80  * @return the EdgeIntersection found or added
81  */
82  void add(const geom::Coordinate& coord, size_t segmentIndex, double dist);
83 
84  const_iterator
85  begin() const
86  {
87  if (!sorted) {
88  std::sort(nodeMap.begin(), nodeMap.end());
89  nodeMap.erase(std::unique(nodeMap.begin(), nodeMap.end()), nodeMap.end());
90  sorted = true;
91  }
92 
93  return nodeMap.begin();
94  }
95  const_iterator
96  end() const
97  {
98  return nodeMap.end();
99  }
100 
101  bool isEmpty() const;
102  bool isIntersection(const geom::Coordinate& pt) const;
103 
104  /*
105  * Adds entries for the first and last points of the edge to the list
106  */
107  void addEndpoints();
108 
117  void addSplitEdges(std::vector<Edge*>* edgeList);
118 
119  Edge* createSplitEdge(const EdgeIntersection* ei0, const EdgeIntersection* ei1);
120  std::string print() const;
121 };
122 
123 std::ostream& operator<< (std::ostream&, const EdgeIntersectionList&);
124 
125 } // namespace geos.geomgraph
126 } // namespace geos
127 
128 #ifdef _MSC_VER
129 #pragma warning(pop)
130 #endif
131 
132 #endif // ifndef GEOS_GEOMGRAPH_EDGEINTERSECTIONLIST_H
133 
Coordinate is the lightweight class used to store coordinates.
Definition: Coordinate.h:60
Definition: EdgeIntersection.h:45
Definition: EdgeIntersectionList.h:59
Basic namespace for all GEOS functionalities.
Definition: IndexedNestedRingTester.h:25
Definition: geomgraph/Edge.h:66