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>
35 namespace geomgraph
{ // geos.geomgraph
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
{
48 // the point of intersection
49 geom::Coordinate coord
;
51 // the edge distance of this point along the containing line segment
54 // the index of the containing line segment in the parent edge
57 EdgeIntersection(const geom::Coordinate
& newCoord
,
58 int newSegmentIndex
, double 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;
71 const geom::Coordinate
& getCoordinate() const {
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
98 // @deprecated, use strict weak ordering operator
99 struct GEOS_DLL EdgeIntersectionLessThen
{
100 bool operator()(const EdgeIntersection
*ei1
,
101 const EdgeIntersection
*ei2
) const
108 inline std::ostream
& operator<< (std::ostream
& os
, const EdgeIntersection
& e
)
110 os
<< e
.coord
<< " seg # = " << e
.segmentIndex
<< " dist = " << e
.dist
;
114 } // namespace geos.geomgraph
117 #endif // ifndef GEOS_GEOMGRAPH_EDGEINTERSECTION_H