17 #ifndef DUALEDGETRIANGULATION_H 
   18 #define DUALEDGETRIANGULATION_H 
   25 #include <QTextStream> 
   26 #include <QMessageBox> 
   28 #include <QStringList> 
   34 #include "qgis_analysis.h" 
   72     double xMax()
 const override { 
return mXMax; }
 
   74     double xMin()
 const override { 
return mXMin; }
 
   76     double yMax()
 const override { 
return mYMax; }
 
   78     double yMin()
 const override { 
return mYMin; }
 
   92     bool swapEdge( 
double x, 
double y ) 
override;
 
  110     static const unsigned int DEFAULT_STORAGE_FOR_POINTS = 100000;
 
  112     QVector<QgsPoint *> mPointVector;
 
  114     static const unsigned int DEFAULT_STORAGE_FOR_HALF_EDGES = 300006;
 
  116     QVector<HalfEdge *> mHalfEdge;
 
  122     unsigned int insertEdge( 
int dual, 
int next, 
int point, 
bool mbreak, 
bool forced );
 
  126     static const int MAX_BASE_ITERATIONS = 300000;
 
  128     int baseEdgeOfPoint( 
int point );
 
  137     int baseEdgeOfTriangle( 
const QgsPoint &point );
 
  139     bool checkSwapRecursively( 
unsigned int edge, 
unsigned int recursiveDeep );
 
  141     bool isEdgeNeedSwap( 
unsigned int edge ) 
const;
 
  143     void doSwapRecursively( 
unsigned int edge, 
unsigned int recursiveDeep );
 
  145     void doOnlySwap( 
unsigned int edge );
 
  147     unsigned int mEdgeInside = 0;
 
  149     int mEdgeOutside = -1;
 
  151     unsigned int mEdgeWithPoint = 0;
 
  153     unsigned int mUnstableEdge = 0;
 
  155     int mTwiceInsPoint = 0;
 
  157     bool swapPossible( 
unsigned int edge ) 
const;
 
  159     void triangulatePolygon( QList<int> *poly, QList<int> *free, 
int mainedge );
 
  161     bool halfEdgeBBoxTest( 
int edge, 
double xlowleft, 
double ylowleft, 
double xupright, 
double yupright ) 
const;
 
  163     double swapMinAngle( 
int edge ) 
const;
 
  165     int splitHalfEdge( 
int edge, 
float position );
 
  167     bool edgeOnConvexHull( 
int edge );
 
  169     void evaluateInfluenceRegion( 
QgsPoint *point, 
int edge, QSet<int> &set );
 
  173     int firstEdgeOutSide();
 
  175     void removeLastPoint();
 
  178     friend class TestQgsInterpolator;
 
  185   mPointVector.reserve( DEFAULT_STORAGE_FOR_POINTS );
 
  186   mHalfEdge.reserve( DEFAULT_STORAGE_FOR_HALF_EDGES );
 
  191   mPointVector.reserve( nop );
 
  192   mHalfEdge.reserve( nop );
 
  197   return mPointVector.count();
 
  202   if ( i < 0 || i >= mPointVector.count() )
 
  205   return mPointVector.at( i );
 
  208 inline bool QgsDualEdgeTriangulation::halfEdgeBBoxTest( 
int edge, 
double xlowleft, 
double ylowleft, 
double xupright, 
double yupright )
 const 
  211            ( 
point( mHalfEdge[edge]->getPoint() )->x() >= xlowleft &&
 
  212              point( mHalfEdge[edge]->getPoint() )->x() <= xupright &&
 
  213              point( mHalfEdge[edge]->getPoint() )->y() >= ylowleft &&
 
  214              point( mHalfEdge[edge]->getPoint() )->y() <= yupright ) ||
 
  215            ( 
point( mHalfEdge[mHalfEdge[edge]->getDual()]->getPoint() )->x() >= xlowleft &&
 
  216              point( mHalfEdge[mHalfEdge[edge]->getDual()]->getPoint() )->x() <= xupright &&
 
  217              point( mHalfEdge[mHalfEdge[edge]->getDual()]->getPoint() )->y() >= ylowleft &&
 
  218              point( mHalfEdge[mHalfEdge[edge]->getDual()]->getPoint() )->y() <= yupright )
 
DualEdgeTriangulation is an implementation of a triangulation class based on the dual edge data struc...
QgsPoint * point(int i) const override
Draws the points, edges and the forced lines.
double yMax() const override
Returns the largest y-coordinate value of the bounding box.
int pointsCount() const override
Returns the number of points.
double xMax() const override
Returns the largest x-coordinate value of the bounding box.
double xMin() const override
Returns the smallest x-coordinate value of the bounding box.
double yMin() const override
Returns the smallest x-coordinate value of the bounding box.
QgsDualEdgeTriangulation()
An interface for objects which accept features via addFeature(s) methods.
Base class for feedback objects to be used for cancellation of something running in a worker thread.
SourceType
Describes the type of input data.
Point geometry type, with support for z-dimension and m-values.
Interface for Triangulation classes.
virtual QgsPoint * point(int i) const =0
Returns a pointer to the point with number i.
virtual bool calcNormal(double x, double y, QgsPoint &result)=0
Calculates the normal at a point on the surface and assigns it to 'result'.
virtual QgsMesh triangulationToMesh(QgsFeedback *feedback=nullptr) const =0
Returns a QgsMesh corresponding to the triangulation.
virtual void eliminateHorizontalTriangles()=0
Eliminates the horizontal triangles by swapping.
virtual void performConsistencyTest()=0
Performs a consistency check, remove this later.
virtual void ruppertRefinement()=0
Adds points to make the triangles better shaped (algorithm of ruppert)
virtual int pointsCount() const =0
Returns the number of points.
virtual QList< int > surroundingTriangles(int pointno)=0
Returns a value list with the information of the triangles surrounding (counterclockwise) a point.
ForcedCrossBehavior
Enumeration describing the behavior, if two forced lines cross.
@ DeleteFirst
The status of the first inserted forced line is reset to that of a normal edge (so that the second in...
virtual bool saveTriangulation(QgsFeatureSink *sink, QgsFeedback *feedback=nullptr) const =0
Saves the triangulation features to a feature sink.
virtual void addLine(const QgsPointSequence &points, QgsInterpolator::SourceType lineType)=0
Adds a line (e.g.
virtual bool calcPoint(double x, double y, QgsPoint &result)=0
Calculates x-, y and z-value of the point on the surface and assigns it to 'result'.
virtual int oppositePoint(int p1, int p2)=0
Returns the number of the point opposite to the triangle points p1, p2 (which have to be on a halfedg...
virtual int addPoint(const QgsPoint &point)=0
Adds a point to the triangulation.
virtual bool swapEdge(double x, double y)=0
Reads the content of a taff-file.
virtual QList< int > pointsAroundEdge(double x, double y)=0
Returns a value list with the numbers of the four points, which would be affected by an edge swap.
virtual void setTriangleInterpolator(TriangleInterpolator *interpolator)=0
Sets an interpolator object.
virtual bool triangleVertices(double x, double y, QgsPoint &p1, int &n1, QgsPoint &p2, int &n2, QgsPoint &p3, int &n3)=0
Finds out in which triangle the point with coordinates x and y is and assigns the numbers of the vert...
virtual void setForcedCrossBehavior(QgsTriangulation::ForcedCrossBehavior b)=0
Draws the points, edges and the forced lines.
virtual bool pointInside(double x, double y)=0
Returns true, if the point with coordinates x and y is inside the convex hull and false otherwise.
This is an interface for interpolator classes for triangulations.
Mesh - vertices, edges and faces.