20 #ifndef GEOS_ALGORITHM_LINEINTERSECTOR_H
21 #define GEOS_ALGORITHM_LINEINTERSECTOR_H
23 #include <geos/export.h>
26 #include <geos/geom/Coordinate.h>
49 class GEOS_DLL LineIntersector {
55 static double interpolateZ(
const geom::Coordinate& p,
const geom::Coordinate& p0,
const geom::Coordinate& p1);
76 static double computeEdgeDistance(
const geom::Coordinate& p,
const geom::Coordinate& p0,
const geom::Coordinate& p1);
78 static double nonRobustComputeEdgeDistance(
const geom::Coordinate& p,
const geom::Coordinate& p1,
79 const geom::Coordinate& p2);
81 LineIntersector(
const geom::PrecisionModel* initialPrecisionModel =
nullptr)
83 precisionModel(initialPrecisionModel),
97 bool isInteriorIntersection();
106 bool isInteriorIntersection(
int inputLineIndex);
117 precisionModel = newPM;
143 POINT_INTERSECTION = 1,
146 COLLINEAR_INTERSECTION = 2
150 void computeIntersection(
const geom::Coordinate& p1,
const geom::Coordinate& p2,
151 const geom::Coordinate& p3,
const geom::Coordinate& p4);
153 std::string toString()
const;
161 hasIntersection()
const
163 return result != NO_INTERSECTION;
171 getIntersectionNum()
const
184 getIntersection(
size_t intIndex)
const
186 return intPt[intIndex];
193 static bool isSameSignAndNonZero(
double a,
double b);
224 return hasIntersection() && isProperVar;
237 const geom::Coordinate& getIntersectionAlongSegment(
int segmentIndex,
int intIndex);
248 int getIndexAlongSegment(
int segmentIndex,
int intIndex);
259 double getEdgeDistance(
size_t geomIndex,
size_t intIndex)
const;
283 int intLineIndex[2][2];
292 return result == COLLINEAR_INTERSECTION;
301 return hasIntersection() && !isProperVar;
304 void computeIntLineIndex();
306 void computeIntLineIndex(
int segmentIndex);
308 int computeCollinearIntersection(
const geom::Coordinate& p1,
const geom::Coordinate& p2,
309 const geom::Coordinate& q1,
const geom::Coordinate& q2);
320 geom::Coordinate intersection(
const geom::Coordinate& p1,
321 const geom::Coordinate& p2,
322 const geom::Coordinate& q1,
323 const geom::Coordinate& q2)
const;
335 bool isInSegmentEnvelopes(
const geom::Coordinate& intPt)
const;
350 geom::Coordinate intersectionSafe(
const geom::Coordinate& p1,
const geom::Coordinate& p2,
351 const geom::Coordinate& q1,
const geom::Coordinate& q2)
const;
359 #endif // GEOS_ALGORITHM_LINEINTERSECTOR_H