17 #include <geos/geom/Coordinate.h>
18 #include <geos/simplify/LinkedRing.h>
19 #include <geos/index/VertexSequencePackedRtree.h>
59 RingHull(
const LinearRing* p_ring,
bool p_isOuter);
61 void setMinVertexNum(std::size_t minVertexNum);
63 void setMaxAreaDelta(
double maxAreaDelta);
67 std::unique_ptr<LinearRing> getHull(RingHullIndex& hullIndex);
69 static bool isConvex(
const LinkedRing& vertexRing, std::size_t index);
71 static double area(
const LinkedRing& vertexRing, std::size_t index);
73 void compute(RingHullIndex& hullIndex);
75 std::unique_ptr<Polygon> toGeometry()
const;
93 Corner(std::size_t p_idx, std::size_t p_prev, std::size_t p_next,
double p_area)
100 inline int compareTo(
const Corner& rhs)
const {
101 if (area == rhs.getArea()) {
102 if (index == rhs.getIndex())
104 else return index < rhs.getIndex() ? -1 : 1;
106 else return area < rhs.getArea() ? -1 : 1;
109 inline bool operator< (
const Corner& rhs)
const {
110 return compareTo(rhs) < 0;
113 inline bool operator> (
const Corner& rhs)
const {
114 return compareTo(rhs) > 0;
117 inline bool operator==(
const Corner& rhs)
const {
118 return compareTo(rhs) == 0;
121 bool isVertex(std::size_t p_index)
const;
122 std::size_t getIndex()
const;
123 double getArea()
const;
124 void envelope(
const LinkedRing& ring,
Envelope& env)
const;
125 bool intersects(
const Coordinate& v,
const LinkedRing& ring)
const;
126 bool isRemoved(
const LinkedRing& ring)
const;
127 std::unique_ptr<LineString> toLineString(
const LinkedRing& ring);
130 inline bool operator()(
const Corner & a,
const Corner & b)
const {
135 using PriorityQueue = std::priority_queue<Corner, std::vector<Corner>, Corner::Greater>;
142 double targetVertexNum = -1.0;
143 double targetAreaDelta = -1.0;
150 std::unique_ptr<CoordinateSequence> vertex;
151 std::unique_ptr<LinkedRing> vertexRing;
152 double areaDelta = 0;
159 std::unique_ptr<VertexSequencePackedRtree> vertexIndex;
161 Corner::PriorityQueue cornerQueue;
165 void addCorner(std::size_t i, Corner::PriorityQueue& cornerQueue);
166 bool isAtTarget(
const Corner& corner);
177 void removeCorner(
const Corner& corner, Corner::PriorityQueue& cornerQueue);
178 bool isRemovable(
const Corner& corner,
const RingHullIndex& hullIndex)
const;
189 bool hasIntersectingVertex(
190 const Corner& corner,
192 const RingHull* hull)
const;
194 const Coordinate& getCoordinate(std::size_t index)
const;
198 std::vector<std::size_t>& result)
const;
200 void queryHull(
const Envelope& queryEnv, std::vector<Coordinate>& pts);
The internal representation of a list of coordinates inside a Geometry.
Definition: CoordinateSequence.h:56
Coordinate is the lightweight class used to store coordinates.
Definition: Coordinate.h:216
An Envelope defines a rectangulare region of the 2D coordinate plane.
Definition: Envelope.h:58
Definition: LineString.h:65
Models an OGC SFS LinearRing. A LinearRing is a LineString which is both closed and simple.
Definition: LinearRing.h:54
Represents a linear polygon, which may include holes.
Definition: Polygon.h:60
Definition: VertexSequencePackedRtree.h:54
Basic namespace for all GEOS functionalities.
Definition: Angle.h:25