GEOS  3.13.0dev
QuadEdgeSubdivision.h
1 /**********************************************************************
2  *
3  * GEOS - Geometry Engine Open Source
4  * http://geos.osgeo.org
5  *
6  * Copyright (C) 2012 Excensus LLC.
7  * Copyright (C) 2019 Daniel Baston
8  *
9  * This is free software; you can redistribute and/or modify it under
10  * the terms of the GNU Lesser General Licence as published
11  * by the Free Software Foundation.
12  * See the COPYING file for more information.
13  *
14  **********************************************************************
15  *
16  * Last port: triangulate/quadedge/QuadEdgeSubdivision.java r524
17  *
18  **********************************************************************/
19 
20 #pragma once
21 
22 #include <memory>
23 #include <list>
24 #include <stack>
25 #include <unordered_set>
26 #include <array>
27 #include <vector>
28 
29 #include <geos/geom/MultiLineString.h>
30 #include <geos/triangulate/quadedge/QuadEdge.h>
31 #include <geos/triangulate/quadedge/QuadEdgeLocator.h>
32 #include <geos/triangulate/quadedge/QuadEdgeQuartet.h>
33 #include <geos/triangulate/quadedge/Vertex.h>
34 
35 namespace geos {
36 
37 namespace geom {
38 
39 class CoordinateSequence;
40 class GeometryCollection;
41 class MultiLineString;
42 class GeometryFactory;
43 class Coordinate;
44 class Geometry;
45 class Envelope;
46 }
47 
48 namespace triangulate { //geos.triangulate
49 namespace quadedge { //geos.triangulate.quadedge
50 
51 class TriangleVisitor;
52 
78 class GEOS_DLL QuadEdgeSubdivision {
79 public:
80  typedef std::vector<QuadEdge*> QuadEdgeList;
81 
90  static void getTriangleEdges(const QuadEdge& startQE,
91  const QuadEdge* triEdge[3]);
92 
93 private:
98  std::deque<QuadEdgeQuartet> quadEdges;
99  std::array<QuadEdge*, 3> startingEdges;
100  double tolerance;
101  double edgeCoincidenceTolerance;
102  std::array<Vertex, 3> frameVertex;
103  geom::Envelope frameEnv;
104  std::unique_ptr<QuadEdgeLocator> locator;
105  bool visit_state_clean;
106 
107 public:
116  QuadEdgeSubdivision(const geom::Envelope& env, double tolerance);
117 
118  virtual ~QuadEdgeSubdivision() = default;
119 
120 private:
121  virtual void createFrame(const geom::Envelope& env);
122 
123  virtual void initSubdiv();
124 
125 public:
131  inline double
132  getTolerance() const
133  {
134  return tolerance;
135  }
136 
142  inline const geom::Envelope&
143  getEnvelope() const
144  {
145  return frameEnv;
146  }
147 
154  inline std::deque<QuadEdgeQuartet>&
156  {
157  return quadEdges;
158  }
159 
167  inline void
168  setLocator(std::unique_ptr<QuadEdgeLocator> p_locator)
169  {
170  this->locator = std::move(p_locator);
171  }
172 
180  virtual QuadEdge& makeEdge(const Vertex& o, const Vertex& d);
181 
192  virtual QuadEdge& connect(QuadEdge& a, QuadEdge& b);
193 
200  void remove(QuadEdge& e);
201 
222  const QuadEdge& startEdge) const;
223 
234  inline QuadEdge*
235  locate(const Vertex& v) const
236  {
237  return locator->locate(v);
238  }
239 
250  inline QuadEdge*
252  {
253  return locator->locate(Vertex(p));
254  }
255 
268 
285 
292  bool isFrameEdge(const QuadEdge& e) const;
293 
302  bool isFrameBorderEdge(const QuadEdge& e) const;
303 
310  bool isFrameVertex(const Vertex& v) const;
311 
312 
321  bool isOnEdge(const QuadEdge& e, const geom::Coordinate& p) const;
322 
331  bool isVertexOfEdge(const QuadEdge& e, const Vertex& v) const;
332 
344  std::unique_ptr<QuadEdgeList> getPrimaryEdges(bool includeFrame);
345 
346  /*****************************************************************************
347  * Visitors
348  ****************************************************************************/
349 
350  void visitTriangles(TriangleVisitor* triVisitor, bool includeFrame);
351 
352 private:
353  typedef std::stack<QuadEdge*> QuadEdgeStack;
354  typedef std::vector<std::unique_ptr<geom::CoordinateSequence>> TriList;
355 
361  std::array<QuadEdge*, 3> m_triEdges;
362 
366  void prepareVisit();
367 
379  std::array<QuadEdge*, 3>* fetchTriangleToVisit(QuadEdge* edge, QuadEdgeStack& edgeStack, bool includeFrame);
380 
387  void getTriangleCoordinates(TriList* triList, bool includeFrame);
388 
389 private:
390  class TriangleCoordinatesVisitor;
391  class TriangleCircumcentreVisitor;
392 
393 public:
402  std::unique_ptr<geom::MultiLineString> getEdges(const geom::GeometryFactory& geomFact);
403 
414  std::unique_ptr<geom::GeometryCollection> getTriangles(const geom::GeometryFactory& geomFact);
415 
428  std::unique_ptr<geom::GeometryCollection> getVoronoiDiagram(const geom::GeometryFactory& geomFact);
429 
441  std::unique_ptr<geom::MultiLineString> getVoronoiDiagramEdges(const geom::GeometryFactory& geomFact);
442 
454  std::vector<std::unique_ptr<geom::Geometry>> getVoronoiCellPolygons(const geom::GeometryFactory& geomFact);
455 
467  std::vector<std::unique_ptr<geom::Geometry>> getVoronoiCellEdges(const geom::GeometryFactory& geomFact);
468 
482  std::unique_ptr<QuadEdgeSubdivision::QuadEdgeList> getVertexUniqueEdges(bool includeFrame);
483 
495  std::unique_ptr<geom::Geometry> getVoronoiCellPolygon(const QuadEdge* qe, const geom::GeometryFactory& geomFact);
496 
508  std::unique_ptr<geom::Geometry> getVoronoiCellEdge(const QuadEdge* qe, const geom::GeometryFactory& geomFact);
509 
510 };
511 
512 } //namespace geos.triangulate.quadedge
513 } //namespace geos.triangulate
514 } //namespace goes
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
Supplies a set of utility methods for building Geometry objects from CoordinateSequence or other Geom...
Definition: GeometryFactory.h:65
A class that contains the QuadEdges representing a planar subdivision that models a triangulation.
Definition: QuadEdgeSubdivision.h:78
bool isFrameBorderEdge(const QuadEdge &e) const
Tests whether a QuadEdge is an edge on the border of the frame facets and the internal facets....
std::unique_ptr< geom::GeometryCollection > getTriangles(const geom::GeometryFactory &geomFact)
Gets the geometry for the triangles in a triangulated subdivision as a GeometryCollection of triangul...
bool isFrameEdge(const QuadEdge &e) const
Tests whether a QuadEdge is an edge incident on a frame triangle vertex.
QuadEdge * locate(const geom::Coordinate &p)
Finds a quadedge of a triangle containing a location specified by a geom::Coordinate,...
Definition: QuadEdgeSubdivision.h:251
virtual QuadEdge & connect(QuadEdge &a, QuadEdge &b)
Creates a new QuadEdge connecting the destination of a to the origin of b, in such a way that all thr...
std::unique_ptr< geom::Geometry > getVoronoiCellEdge(const QuadEdge *qe, const geom::GeometryFactory &geomFact)
Gets the Voronoi cell edge around a site specified by the origin of a QuadEdge.
static void getTriangleEdges(const QuadEdge &startQE, const QuadEdge *triEdge[3])
Gets the edges for the triangle to the left of the given QuadEdge.
const geom::Envelope & getEnvelope() const
Gets the envelope of the Subdivision (including the frame).
Definition: QuadEdgeSubdivision.h:143
bool isFrameVertex(const Vertex &v) const
Tests whether a vertex is a vertex of the outer triangle.
QuadEdge * locate(const geom::Coordinate &p0, const geom::Coordinate &p1)
Locates the edge between the given vertices, if it exists in the subdivision.
void remove(QuadEdge &e)
Deletes a quadedge from the subdivision. Linked quadedges are updated to reflect the deletion.
QuadEdge * locate(const Vertex &v) const
Finds a quadedge of a triangle containing a location specified by a Vertex, if one exists.
Definition: QuadEdgeSubdivision.h:235
std::deque< QuadEdgeQuartet > & getEdges()
Gets the collection of base QuadEdges (one for every pair of vertices which is connected).
Definition: QuadEdgeSubdivision.h:155
QuadEdgeSubdivision(const geom::Envelope &env, double tolerance)
Creates a new instance of a quad-edge subdivision based on a frame triangle that encloses a supplied ...
std::unique_ptr< geom::Geometry > getVoronoiCellPolygon(const QuadEdge *qe, const geom::GeometryFactory &geomFact)
Gets the Voronoi cell around a site specified by the origin of a QuadEdge.
std::vector< std::unique_ptr< geom::Geometry > > getVoronoiCellEdges(const geom::GeometryFactory &geomFact)
Gets a List of LineStrings for the Voronoi cells of this triangulation.
std::unique_ptr< QuadEdgeSubdivision::QuadEdgeList > getVertexUniqueEdges(bool includeFrame)
Gets a collection of QuadEdges whose origin vertices are a unique set which includes all vertices in ...
std::unique_ptr< QuadEdgeList > getPrimaryEdges(bool includeFrame)
Gets all primary quadedges in the subdivision.
double getTolerance() const
Gets the vertex-equality tolerance value used in this subdivision.
Definition: QuadEdgeSubdivision.h:132
bool isOnEdge(const QuadEdge &e, const geom::Coordinate &p) const
Tests whether a Coordinate lies on a QuadEdge, up to a tolerance determined by the subdivision tolera...
virtual QuadEdge & makeEdge(const Vertex &o, const Vertex &d)
Creates a new quadedge, recording it in the edges list.
std::unique_ptr< geom::GeometryCollection > getVoronoiDiagram(const geom::GeometryFactory &geomFact)
Gets the cells in the Voronoi diagram for this triangulation. The cells are returned as a GeometryCol...
std::vector< std::unique_ptr< geom::Geometry > > getVoronoiCellPolygons(const geom::GeometryFactory &geomFact)
Gets a List of Polygons for the Voronoi cells of this triangulation.
std::unique_ptr< geom::MultiLineString > getVoronoiDiagramEdges(const geom::GeometryFactory &geomFact)
Gets the cells in the Voronoi diagram for this triangulation.
std::unique_ptr< geom::MultiLineString > getEdges(const geom::GeometryFactory &geomFact)
Gets the geometry for the edges in the subdivision as a MultiLineString containing 2-point lines.
QuadEdge * locateFromEdge(const Vertex &v, const QuadEdge &startEdge) const
Locates an edge of a triangle which contains a location specified by a Vertex v.
QuadEdge & insertSite(const Vertex &v)
Inserts a new site into the Subdivision, connecting it to the vertices of the containing triangle (or...
void setLocator(std::unique_ptr< QuadEdgeLocator > p_locator)
Sets the QuadEdgeLocator to use for locating containing triangles in this subdivision.
Definition: QuadEdgeSubdivision.h:168
bool isVertexOfEdge(const QuadEdge &e, const Vertex &v) const
Tests whether a Vertex is the start or end vertex of a QuadEdge, up to the subdivision tolerance dist...
A class that represents the edge data structure which implements the quadedge algebra.
Definition: QuadEdge.h:53
An interface for algorithms which process the triangles in a QuadEdgeSubdivision.
Definition: TriangleVisitor.h:33
Models a site (node) in a QuadEdgeSubdivision.
Definition: Vertex.h:60
Basic namespace for all GEOS functionalities.
Definition: Angle.h:25