18#include <geos/geom/Coordinate.h>
19#include <geos/noding/SegmentIntersector.h>
20#include <geos/algorithm/LineIntersector.h>
21#include <geos/operation/valid/TopologyValidationError.h>
24#include <geos/export.h>
37class GEOS_DLL PolygonIntersectionAnalyzer :
public noding::SegmentIntersector {
38 using CoordinateXY = geos::geom::CoordinateXY;
43 algorithm::LineIntersector li;
44 bool m_hasDoubleTouch =
false;
45 bool isInvertedRingValid =
false;
46 int invalidCode = TopologyValidationError::oNoInvalidIntersection;
47 CoordinateXY invalidLocation;
48 CoordinateXY doubleTouchLocation;
50 int findInvalidIntersection(
51 const SegmentString* ss0, std::size_t segIndex0,
52 const SegmentString* ss1, std::size_t segIndex1);
54 static bool addDoubleTouch(
55 const SegmentString* ss0,
const SegmentString* ss1,
56 const CoordinateXY& intPt);
59 const SegmentString* ss,
const CoordinateXY& intPt,
60 const CoordinateXY* e00,
const CoordinateXY* e01,
61 const CoordinateXY* e10,
const CoordinateXY* e11);
63 static const CoordinateXY& prevCoordinateInRing(
64 const SegmentString* ringSS, std::size_t segIndex);
66 static bool isAdjacentInRing(
const SegmentString* ringSS,
67 std::size_t segIndex0, std::size_t segIndex1);
77 PolygonIntersectionAnalyzer(
bool p_isInvertedRingValid)
78 : isInvertedRingValid(p_isInvertedRingValid)
79 , invalidLocation(CoordinateXY::getNull())
80 , doubleTouchLocation(CoordinateXY::getNull())
83 void processIntersections(
84 SegmentString* ss0, std::size_t segIndex0,
85 SegmentString* ss1, std::size_t segIndex1)
override;
87 bool isDone()
const override {
88 return isInvalid() || m_hasDoubleTouch;
91 bool isInvalid()
const
93 return invalidCode >= 0;
96 int getInvalidCode()
const
101 const CoordinateXY& getInvalidLocation()
const
103 return invalidLocation;
106 bool hasDoubleTouch()
const
108 return m_hasDoubleTouch;
111 const CoordinateXY& getDoubleTouchLocation()
const
113 return doubleTouchLocation;
An interface for classes which represent a sequence of contiguous line segments.
Definition SegmentString.h:49
Basic namespace for all GEOS functionalities.
Definition geos.h:38