GEOS 3.8.1
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
41namespace geos {
42namespace geom {
43class Coordinate;
44}
45namespace geomgraph {
46class Edge;
47}
48}
49
50namespace geos {
51namespace geomgraph { // geos.geomgraph
52
53
59class GEOS_DLL EdgeIntersectionList {
60public:
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
67private:
68 mutable container nodeMap;
69 mutable bool sorted;
70
71public:
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
123std::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: EdgeIntersectionList.h:59
void addSplitEdges(std::vector< Edge * > *edgeList)
Definition: EdgeIntersection.h:45
Definition: geomgraph/Edge.h:66
Basic namespace for all GEOS functionalities.
Definition: IndexedNestedRingTester.h:25