GEOS  3.14.0dev
EdgeIntersection.h
1 /**********************************************************************
2  *
3  * GEOS - Geometry Engine Open Source
4  * http://geos.osgeo.org
5  *
6  * Copyright (C) 2009-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/EdgeIntersection.java rev. 1.5 (JTS-1.10)
18  *
19  **********************************************************************/
20 
21 
22 #pragma once
23 
24 #include <geos/export.h>
25 
26 #include <geos/geom/Coordinate.h> // for composition and inlines
27 
28 #include <ostream>
29 
30 
31 namespace geos {
32 namespace geomgraph { // geos.geomgraph
33 
42 class GEOS_DLL EdgeIntersection final {
43 public:
44 
45  // the point of intersection
46  geom::Coordinate coord;
47 
48  // the edge distance of this point along the containing line segment
49  double dist;
50 
51  // the index of the containing line segment in the parent edge
52  std::size_t segmentIndex;
53 
54  EdgeIntersection(const geom::Coordinate& newCoord,
55  std::size_t newSegmentIndex, double newDist)
56  :
57  coord(newCoord),
58  dist(newDist),
59  segmentIndex(newSegmentIndex)
60  {}
61 
62  bool
63  isEndPoint(std::size_t maxSegmentIndex) const
64  {
65  if(segmentIndex == 0 && dist == 0.0) {
66  return true;
67  }
68  if(segmentIndex == maxSegmentIndex) {
69  return true;
70  }
71  return false;
72  }
73 
74  const geom::Coordinate&
75  getCoordinate() const
76  {
77  return coord;
78  }
79 
80  size_t
81  getSegmentIndex() const
82  {
83  return segmentIndex;
84  }
85 
86  double
87  getDistance() const
88  {
89  return dist;
90  }
91 
92  bool operator==(const EdgeIntersection& other) const {
93  return segmentIndex == other.segmentIndex &&
94  dist == other.dist;
95 
96  // We don't check the coordinate, consistent with operator<
97  }
98 
99 };
100 
104 inline bool
105 operator< (const EdgeIntersection& ei1, const EdgeIntersection& ei2)
106 {
107  if(ei1.segmentIndex < ei2.segmentIndex) {
108  return true;
109  }
110  if(ei1.segmentIndex == ei2.segmentIndex) {
111  if(ei1.dist < ei2.dist) {
112  return true;
113  }
114 
115  // TODO: check if the Coordinate matches, or this will
116  // be a robustness issue in computing distance
117  // See http://trac.osgeo.org/geos/ticket/350
118  }
119  return false;
120 }
121 
122 // @deprecated, use strict weak ordering operator
123 struct GEOS_DLL EdgeIntersectionLessThen {
124  bool
125  operator()(const EdgeIntersection* ei1,
126  const EdgeIntersection* ei2) const
127  {
128  return *ei1 < *ei2;
129  }
130 
131  bool
132  operator()(const EdgeIntersection& ei1,
133  const EdgeIntersection& ei2) const
134  {
135  return ei1 < ei2;
136  }
137 };
138 
140 inline std::ostream&
141 operator<< (std::ostream& os, const EdgeIntersection& e)
142 {
143  os << e.coord << " seg # = " << e.segmentIndex << " dist = " << e.dist;
144  return os;
145 }
146 
147 } // namespace geos.geomgraph
148 } // namespace geos
149 
Coordinate is the lightweight class used to store coordinates.
Definition: Coordinate.h:217
Represents a point on an edge which intersects with another edge.
Definition: EdgeIntersection.h:42
bool operator<(const EdgeIntersection &ei1, const EdgeIntersection &ei2)
Definition: EdgeIntersection.h:105
Basic namespace for all GEOS functionalities.
Definition: Angle.h:25