GEOS  3.9.1dev
QuadEdgeSubdivision.h
Go to the documentation of this file.
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 #ifndef GEOS_TRIANGULATE_QUADEDGE_QUADEDGESUBDIVISION_H
21 #define GEOS_TRIANGULATE_QUADEDGE_QUADEDGESUBDIVISION_H
22 
23 #include <memory>
24 #include <list>
25 #include <stack>
26 #include <unordered_set>
27 #include <vector>
28 
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 
53 const double EDGE_COINCIDENCE_TOL_FACTOR = 1000;
54 
81 public:
82  typedef std::vector<QuadEdge*> QuadEdgeList;
83 
92  static void getTriangleEdges(const QuadEdge& startQE,
93  const QuadEdge* triEdge[3]);
94 
95 private:
100  std::deque<QuadEdgeQuartet> quadEdges;
101  std::array<QuadEdge*, 3> startingEdges;
102  double tolerance;
104  std::array<Vertex, 3> frameVertex;
106  std::unique_ptr<QuadEdgeLocator> locator;
108 
109 public:
118  QuadEdgeSubdivision(const geom::Envelope& env, double tolerance);
119 
120  virtual ~QuadEdgeSubdivision() = default;
121 
122 private:
123  virtual void createFrame(const geom::Envelope& env);
124 
125  virtual void initSubdiv();
126 
127 public:
133  inline double
134  getTolerance() const
135  {
136  return tolerance;
137  }
138 
144  inline const geom::Envelope&
145  getEnvelope() const
146  {
147  return frameEnv;
148  }
149 
156  inline std::deque<QuadEdgeQuartet>&
158  {
159  return quadEdges;
160  }
161 
169  inline void
170  setLocator(std::unique_ptr<QuadEdgeLocator> p_locator)
171  {
172  this->locator = std::move(p_locator);
173  }
174 
182  virtual QuadEdge& makeEdge(const Vertex& o, const Vertex& d);
183 
194  virtual QuadEdge& connect(QuadEdge& a, QuadEdge& b);
195 
202  void remove(QuadEdge& e);
203 
223  QuadEdge* locateFromEdge(const Vertex& v,
224  const QuadEdge& startEdge) const;
225 
236  inline QuadEdge*
237  locate(const Vertex& v) const
238  {
239  return locator->locate(v);
240  }
241 
252  inline QuadEdge*
254  {
255  return locator->locate(Vertex(p));
256  }
257 
269  QuadEdge* locate(const geom::Coordinate& p0, const geom::Coordinate& p1);
270 
286  QuadEdge& insertSite(const Vertex& v);
287 
294  bool isFrameEdge(const QuadEdge& e) const;
295 
304  bool isFrameBorderEdge(const QuadEdge& e) const;
305 
312  bool isFrameVertex(const Vertex& v) const;
313 
314 
323  bool isOnEdge(const QuadEdge& e, const geom::Coordinate& p) const;
324 
333  bool isVertexOfEdge(const QuadEdge& e, const Vertex& v) const;
334 
346  std::unique_ptr<QuadEdgeList> getPrimaryEdges(bool includeFrame);
347 
348  /*****************************************************************************
349  * Visitors
350  ****************************************************************************/
351 
352  void visitTriangles(TriangleVisitor* triVisitor, bool includeFrame);
353 
354 private:
355  typedef std::stack<QuadEdge*> QuadEdgeStack;
356  typedef std::vector<std::unique_ptr<geom::CoordinateSequence>> TriList;
357 
363  QuadEdge* triEdges[3];
364 
368  void prepareVisit();
369 
381  QuadEdge** fetchTriangleToVisit(QuadEdge* edge, QuadEdgeStack& edgeStack, bool includeFrame);
382 
389  void getTriangleCoordinates(TriList* triList, bool includeFrame);
390 
391 private:
392  class TriangleCoordinatesVisitor;
393  class TriangleCircumcentreVisitor;
394 
395 public:
404  std::unique_ptr<geom::MultiLineString> getEdges(const geom::GeometryFactory& geomFact);
405 
416  std::unique_ptr<geom::GeometryCollection> getTriangles(const geom::GeometryFactory& geomFact);
417 
430  std::unique_ptr<geom::GeometryCollection> getVoronoiDiagram(const geom::GeometryFactory& geomFact);
431 
443  std::unique_ptr<geom::MultiLineString> getVoronoiDiagramEdges(const geom::GeometryFactory& geomFact);
444 
456  std::vector<std::unique_ptr<geom::Geometry>> getVoronoiCellPolygons(const geom::GeometryFactory& geomFact);
457 
469  std::vector<std::unique_ptr<geom::Geometry>> getVoronoiCellEdges(const geom::GeometryFactory& geomFact);
470 
484  std::unique_ptr<QuadEdgeSubdivision::QuadEdgeList> getVertexUniqueEdges(bool includeFrame);
485 
497  std::unique_ptr<geom::Geometry> getVoronoiCellPolygon(const QuadEdge* qe, const geom::GeometryFactory& geomFact);
498 
510  std::unique_ptr<geom::Geometry> getVoronoiCellEdge(const QuadEdge* qe, const geom::GeometryFactory& geomFact);
511 
512 };
513 
514 } //namespace geos.triangulate.quadedge
515 } //namespace geos.triangulate
516 } //namespace goes
517 
518 #endif //GEOS_TRIANGULATE_QUADEDGE_QUADEDGESUBDIVISION_H
An Envelope defines a rectangulare region of the 2D coordinate plane.
Definition: Envelope.h:58
QuadEdge * locate(const geom::Coordinate &p)
Finds a quadedge of a triangle containing a location specified by a geom::Coordinate, if one exists.
#define GEOS_DLL
Definition: export.h:28
An interface for algorithms which process the triangles in a QuadEdgeSubdivision. ...
Coordinate is the lightweight class used to store coordinates.
Definition: Coordinate.h:60
QuadEdge * locate(const Vertex &v) const
Finds a quadedge of a triangle containing a location specified by a Vertex, if one exists...
Models a site (node) in a QuadEdgeSubdivision.
Definition: Vertex.h:60
Supplies a set of utility methods for building Geometry objects from CoordinateSequence or other Geom...
std::deque< QuadEdgeQuartet > & getEdges()
Gets the collection of base QuadEdges (one for every pair of vertices which is connected).
A class that contains the QuadEdges representing a planar subdivision that models a triangulation...
Basic namespace for all GEOS functionalities.
void setLocator(std::unique_ptr< QuadEdgeLocator > p_locator)
Sets the QuadEdgeLocator to use for locating containing triangles in this subdivision.
double getTolerance() const
Gets the vertex-equality tolerance value used in this subdivision.
std::vector< std::unique_ptr< geom::CoordinateSequence > > TriList
A class that represents the edge data structure which implements the quadedge algebra.
Definition: QuadEdge.h:54
const geom::Envelope & getEnvelope() const
Gets the envelope of the Subdivision (including the frame).