GEOS 3.6.2
LineIntersector.h
1/**********************************************************************
2 *
3 * GEOS - Geometry Engine Open Source
4 * http://geos.osgeo.org
5 *
6 * Copyright (C) 2005-2006 Refractions Research Inc.
7 * Copyright (C) 2001-2002 Vivid Solutions Inc.
8 *
9 * This is free software; you can redistribute and/or modify it under
10 * the terms of the GNU Lesser General Public Licence as published
11 * by the Free Software Foundation.
12 * See the COPYING file for more information.
13 *
14 **********************************************************************
15 *
16 * Last port: algorithm/RobustLineIntersector.java r785 (JTS-1.13+)
17 *
18 **********************************************************************/
19
20#ifndef GEOS_ALGORITHM_LINEINTERSECTOR_H
21#define GEOS_ALGORITHM_LINEINTERSECTOR_H
22
23#include <geos/export.h>
24#include <string>
25
26#include <geos/geom/Coordinate.h>
27
28// Forward declarations
29namespace geos {
30 namespace geom {
31 class PrecisionModel;
32 }
33}
34
35namespace geos {
36namespace algorithm { // geos::algorithm
37
49class GEOS_DLL LineIntersector {
50public:
51
55 static double interpolateZ(const geom::Coordinate &p, const geom::Coordinate &p0, const geom::Coordinate &p1);
56
57
59 //
76 static double computeEdgeDistance(const geom::Coordinate& p, const geom::Coordinate& p0, const geom::Coordinate& p1);
77
78 static double nonRobustComputeEdgeDistance(const geom::Coordinate& p,const geom::Coordinate& p1,const geom::Coordinate& p2);
79
80 LineIntersector(const geom::PrecisionModel* initialPrecisionModel=NULL)
81 :
82 precisionModel(initialPrecisionModel),
83 result(0),
84 isProperVar(false)
85 {}
86
88
97
105 bool isInteriorIntersection(int inputLineIndex);
106
108 //
114 precisionModel=newPM;
115 }
116
118 //
124
126 static bool hasIntersection(const geom::Coordinate& p,const geom::Coordinate& p1,const geom::Coordinate& p2);
127
128 // These are deprecated, due to ambiguous naming
129 enum {
130 DONT_INTERSECT=0,
131 DO_INTERSECT=1,
132 COLLINEAR=2
133 };
134
135 enum {
138
141
144 };
145
148 const geom::Coordinate& p3, const geom::Coordinate& p4);
149
150 std::string toString() const;
151
157 bool hasIntersection() const { return result!=NO_INTERSECTION; }
158
160 //
163 int getIntersectionNum() const { return result; }
164
165
167 //
172 const geom::Coordinate& getIntersection(int intIndex) const {
173 return intPt[intIndex];
174 }
175
177 //
180 static bool isSameSignAndNonZero(double a,double b);
181
192 bool isIntersection(const geom::Coordinate& pt) const;
193
208 bool isProper() const {
209 return hasIntersection()&&isProperVar;
210 }
211
222 const geom::Coordinate& getIntersectionAlongSegment(int segmentIndex,int intIndex);
223
233 int getIndexAlongSegment(int segmentIndex,int intIndex);
234
244 double getEdgeDistance(int geomIndex,int intIndex) const;
245
246private:
247
248 void intersectionWithNormalization(const geom::Coordinate& p1,
249 const geom::Coordinate& p2,
250 const geom::Coordinate& q1,
251 const geom::Coordinate& q2,
252 geom::Coordinate &ret) const;
253
258 const geom::PrecisionModel *precisionModel;
259
260 int result;
261
262 const geom::Coordinate *inputLines[2][2];
263
268 geom::Coordinate intPt[2];
269
274 int intLineIndex[2][2];
275
276 bool isProperVar;
277 //Coordinate &pa;
278 //Coordinate &pb;
279
280 bool isCollinear() const { return result==COLLINEAR_INTERSECTION; }
281
282 int computeIntersect(const geom::Coordinate& p1,const geom::Coordinate& p2,const geom::Coordinate& q1,const geom::Coordinate& q2);
283
284 bool isEndPoint() const {
285 return hasIntersection()&&!isProperVar;
286 }
287
288 void computeIntLineIndex();
289
290 void computeIntLineIndex(int segmentIndex);
291
292 int computeCollinearIntersection(const geom::Coordinate& p1,
293 const geom::Coordinate& p2, const geom::Coordinate& q1,
294 const geom::Coordinate& q2);
295
305 void intersection(const geom::Coordinate& p1,
306 const geom::Coordinate& p2,
307 const geom::Coordinate& q1,
308 const geom::Coordinate& q2,
309 geom::Coordinate &ret) const;
310
311 double smallestInAbsValue(double x1, double x2,
312 double x3, double x4) const;
313
324 bool isInSegmentEnvelopes(const geom::Coordinate& intPt) const;
325
337 void normalizeToEnvCentre(geom::Coordinate &n00, geom::Coordinate &n01,
339 geom::Coordinate &normPt) const;
340
353 void safeHCoordinateIntersection(const geom::Coordinate& p1,
354 const geom::Coordinate& p2,
355 const geom::Coordinate& q1,
356 const geom::Coordinate& q2,
357 geom::Coordinate& intPt) const;
358
359};
360
361} // namespace geos::algorithm
362} // namespace geos
363
364
365#endif // GEOS_ALGORITHM_LINEINTERSECTOR_H
366
A LineIntersector is an algorithm that can both test whether two line segments intersect and compute ...
Definition LineIntersector.h:49
void computeIntersection(const geom::Coordinate &p1, const geom::Coordinate &p2, const geom::Coordinate &p3, const geom::Coordinate &p4)
Computes the intersection of the lines p1-p2 and p3-p4.
static bool hasIntersection(const geom::Coordinate &p, const geom::Coordinate &p1, const geom::Coordinate &p2)
Same as above but doen's compute intersection point. Faster.
int getIntersectionNum() const
Returns the number of intersection points found.
Definition LineIntersector.h:163
const geom::Coordinate & getIntersectionAlongSegment(int segmentIndex, int intIndex)
Computes the intIndex'th intersection point in the direction of a specified input line segment.
bool isInteriorIntersection(int inputLineIndex)
Tests whether either intersection point is an interior point of the specified input segment.
void setPrecisionModel(const geom::PrecisionModel *newPM)
Force computed intersection to be rounded to a given precision model.
Definition LineIntersector.h:113
bool isInteriorIntersection()
Tests whether either intersection point is an interior point of one of the input segments.
double getEdgeDistance(int geomIndex, int intIndex) const
Computes the "edge distance" of an intersection point along the specified input line segment.
bool hasIntersection() const
Definition LineIntersector.h:157
static bool isSameSignAndNonZero(double a, double b)
Returns false if both numbers are zero.
@ NO_INTERSECTION
Indicates that line segments do not intersect.
Definition LineIntersector.h:137
@ COLLINEAR_INTERSECTION
Indicates that line segments intersect in a line segment.
Definition LineIntersector.h:143
@ POINT_INTERSECTION
Indicates that line segments intersect in a single point.
Definition LineIntersector.h:140
void computeIntersection(const geom::Coordinate &p, const geom::Coordinate &p1, const geom::Coordinate &p2)
Compute the intersection of a point p and the line p1-p2.
int getIndexAlongSegment(int segmentIndex, int intIndex)
Computes the index of the intIndex'th intersection point in the direction of a specified input line s...
bool isProper() const
Tests whether an intersection is proper.
Definition LineIntersector.h:208
static double computeEdgeDistance(const geom::Coordinate &p, const geom::Coordinate &p0, const geom::Coordinate &p1)
Computes the "edge distance" of an intersection point p in an edge.
static double interpolateZ(const geom::Coordinate &p, const geom::Coordinate &p0, const geom::Coordinate &p1)
Return a Z value being the interpolation of Z from p0 and p1 at the given point p.
bool isIntersection(const geom::Coordinate &pt) const
Test whether a point is a intersection point of two line segments.
const geom::Coordinate & getIntersection(int intIndex) const
Returns the intIndex'th intersection point.
Definition LineIntersector.h:172
Coordinate is the lightweight class used to store coordinates.
Definition Coordinate.h:60
Specifies the precision model of the Coordinate in a Geometry.
Definition PrecisionModel.h:87
Contains classes and interfaces implementing fundamental computational geometry algorithms.
Definition Angle.h:33
Contains the Geometry interface hierarchy and supporting classes.
Definition IndexedNestedRingTester.h:26
Basic namespace for all GEOS functionalities.
Definition IndexedNestedRingTester.h:25