Complete Note#1 in the http://wiki.osgeo.org/wiki/GEOS_Provenance_Review to get out...
[geos.git] / include / geos / geomgraph / EdgeIntersection.h
blob1572fe385b56c35f9a2b2a045cac1121ce780e3d
1 /**********************************************************************
3 * GEOS - Geometry Engine Open Source
4 * http://geos.osgeo.org
6 * Copyright (C) 2009-2011 Sandro Santilli <strk@keybit.net>
7 * Copyright (C) 2005-2006 Refractions Research Inc.
8 * Copyright (C) 2001-2002 Vivid Solutions Inc.
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.
15 **********************************************************************
17 * Last port: geomgraph/EdgeIntersection.java rev. 1.5 (JTS-1.10)
19 **********************************************************************/
22 #ifndef GEOS_GEOMGRAPH_EDGEINTERSECTION_H
23 #define GEOS_GEOMGRAPH_EDGEINTERSECTION_H
25 #include <geos/export.h>
27 #include <geos/geom/Coordinate.h> // for composition and inlines
29 #include <geos/inline.h>
31 #include <ostream>
34 namespace geos {
35 namespace geomgraph { // geos.geomgraph
37 /**
38 * Represents a point on an edge which intersects with another edge.
40 * The intersection may either be a single point, or a line segment
41 * (in which case this point is the start of the line segment)
42 * The intersection point must be precise.
45 class GEOS_DLL EdgeIntersection {
46 public:
48 // the point of intersection
49 geom::Coordinate coord;
51 // the edge distance of this point along the containing line segment
52 double dist;
54 // the index of the containing line segment in the parent edge
55 int segmentIndex;
57 EdgeIntersection(const geom::Coordinate& newCoord,
58 int newSegmentIndex, double newDist)
60 coord(newCoord),
61 dist(newDist),
62 segmentIndex(newSegmentIndex)
65 bool isEndPoint(int maxSegmentIndex) const {
66 if (segmentIndex==0 && dist==0.0) return true;
67 if (segmentIndex==maxSegmentIndex) return true;
68 return false;
71 const geom::Coordinate& getCoordinate() const {
72 return coord;
75 int getSegmentIndex() const { return segmentIndex; }
77 double getDistance() const { return dist; }
81 /// Strict weak ordering operator for EdgeIntersection
83 /// This is the C++ equivalent of JTS's compareTo
84 inline bool operator< (const EdgeIntersection& ei1, const EdgeIntersection& ei2)
86 if ( ei1.segmentIndex < ei2.segmentIndex ) return true;
87 if ( ei1.segmentIndex == ei2.segmentIndex )
89 if ( ei1.dist < ei2.dist ) return true;
91 // TODO: check if the Coordinate matches, or this will
92 // be a robustness issue in computin distance
93 // See http://trac.osgeo.org/geos/ticket/350
95 return false;
98 // @deprecated, use strict weak ordering operator
99 struct GEOS_DLL EdgeIntersectionLessThen {
100 bool operator()(const EdgeIntersection *ei1,
101 const EdgeIntersection *ei2) const
103 return *ei1 < *ei2;
107 /// Output operator
108 inline std::ostream& operator<< (std::ostream& os, const EdgeIntersection& e)
110 os << e.coord << " seg # = " << e.segmentIndex << " dist = " << e.dist;
111 return os;
114 } // namespace geos.geomgraph
115 } // namespace geos
117 #endif // ifndef GEOS_GEOMGRAPH_EDGEINTERSECTION_H