QGIS API Documentation
3.16.0-Hannover (43b64b13f3)
|
Go to the documentation of this file.
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 )
double xMin() const override
Returns the smallest x-coordinate value of the bounding box.
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 void ruppertRefinement()=0
Adds points to make the triangles better shaped (algorithm of ruppert)
virtual QgsPoint * point(int i) const =0
Returns a pointer to the point with number i.
Point geometry type, with support for z-dimension and m-values.
double yMax() const override
Returns the largest y-coordinate value of the bounding box.
QgsPoint * point(int i) const override
Draws the points, edges and the forced lines.
Interface for Triangulation classes.
Mesh - vertices, edges and faces.
ForcedCrossBehavior
Enumeration describing the behavior, if two forced lines cross.
virtual void performConsistencyTest()=0
Performs a consistency check, remove this later.
virtual void setTriangleInterpolator(TriangleInterpolator *interpolator)=0
Sets an interpolator object.
virtual bool swapEdge(double x, double y)=0
Reads the content of a taff-file.
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 addPoint(const QgsPoint &point)=0
Adds a point to the triangulation.
virtual QgsMesh triangulationToMesh(QgsFeedback *feedback=nullptr) const =0
Returns a QgsMesh corresponding to the triangulation.
Base class for feedback objects to be used for cancellation of something running in a worker thread.
virtual void eliminateHorizontalTriangles()=0
Eliminates the horizontal triangles by swapping.
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.
SourceType
Describes the type of input data.
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 QList< int > surroundingTriangles(int pointno)=0
Returns a value list with the information of the triangles surrounding (counterclockwise) a point.
@ DeleteFirst
The status of the first inserted forced line is reset to that of a normal edge (so that the second in...
double xMax() const override
Returns the largest x-coordinate value of the bounding box.
virtual void addLine(const QgsPointSequence &points, QgsInterpolator::SourceType lineType)=0
Adds a line (e.g.
QgsDualEdgeTriangulation()
virtual bool calcNormal(double x, double y, QgsPoint &result)=0
Calculates the normal at a point on the surface and assigns it to 'result'.
double yMin() const override
Returns the smallest x-coordinate value of the bounding box.
virtual bool saveTriangulation(QgsFeatureSink *sink, QgsFeedback *feedback=nullptr) const =0
Saves the triangulation features to a feature sink.
int pointsCount() const override
Returns the number of points.
An interface for objects which accept features via addFeature(s) methods.
virtual void setForcedCrossBehavior(QgsTriangulation::ForcedCrossBehavior b)=0
Draws the points, edges and the forced lines.
DualEdgeTriangulation is an implementation of a triangulation class based on the dual edge data struc...
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.
virtual int pointsCount() const =0
Returns the number of points.