QGIS API Documentation 3.43.0-Master (b60ef06885e)
qgstriangularmesh.h
Go to the documentation of this file.
1/***************************************************************************
2 qgstriangularmesh.h
3 -------------------
4 begin : April 2018
5 copyright : (C) 2018 by Peter Petrik
6 email : zilolv at gmail dot com
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
18#ifndef QGSTRIANGULARMESH_H
19#define QGSTRIANGULARMESH_H
20
21
22#define SIP_NO_FILE
23
24#include <QVector>
25#include <QVector3D>
26#include <QSet>
27#include <QList>
28#include <memory>
29#include "qgis_core.h"
30#include "qgsmeshdataprovider.h"
31#include "qgsgeometry.h"
32#include "qgsmeshspatialindex.h"
33#include "qgstopologicalmesh.h"
35
37class QgsRectangle;
38
51class CORE_EXPORT QgsTriangularMesh // TODO rename to QgsRendererMesh in QGIS 4
52{
53 public:
54
57
64 bool update( QgsMesh *nativeMesh, const QgsCoordinateTransform &transform );
65
76 bool update( QgsMesh *nativeMesh );
77
84 const QVector<QgsMeshVertex> &vertices() const ;
85
87 const QVector<QgsMeshFace> &triangles() const ;
88
90 const QVector<QgsMeshEdge> &edges() const ;
91
97 Q_DECL_DEPRECATED const QVector<QgsMeshVertex> &centroids() const ;
98
103 const QVector<QgsMeshVertex> &faceCentroids() const ;
104
109 const QVector<QgsMeshVertex> &edgeCentroids() const ;
110
112 const QVector<int> &trianglesToNativeFaces() const ;
113
115 const QVector<int> &edgesToNativeEdges() const ;
116
125 QgsPointXY transformFromLayerToTrianglesCoordinates( const QgsPointXY &point ) const;
126
136 int faceIndexForPoint( const QgsPointXY &point ) const ;
137
147 int faceIndexForPoint_v2( const QgsPointXY &point ) const;
148
158 int nativeFaceIndexForPoint( const QgsPointXY &point ) const ;
159
169 QList<int> nativeFaceIndexForRectangle( const QgsRectangle &rectangle ) const ;
170
180 QList<int> faceIndexesForRectangle( const QgsRectangle &rectangle ) const ;
181
189 QList<int> edgeIndexesForRectangle( const QgsRectangle &rectangle ) const ;
190
199 QVector<QVector3D> vertexNormals( float vertScale ) const;
200
216 QVector<QgsTriangularMesh *> simplifyMesh( double reductionFactor, int minimumTrianglesCount = 10 ) const;
217
224 double averageTriangleSize() const;
225
236 int levelOfDetail() const;
237
245 QgsRectangle extent() const;
246
251 bool contains( const QgsMesh::ElementType &type ) const;
252
264 {
265 public:
266
268 Changes() = default;
269
273 Changes( const QgsTopologicalMesh::Changes &topologicalChanges, const QgsMesh &nativeMesh );
274
275 private:
276 // triangular mesh elements that can be changed if the triangular mesh is updated, are not stored and have to be retrieve
277 QVector<QgsMeshVertex> mAddedVertices;
278 QList<int> mVerticesIndexesToRemove;
279 QList<int> mChangedVerticesCoordinates;
280 mutable QList<double> mOldZValue;
281 QList<double> mNewZValue;
282 QList<QgsPointXY> mOldXYValue;
283 QList<QgsPointXY> mNewXYValue;
284
285 QVector<QgsMeshFace> mNativeFacesToAdd;
286 QList<int> mNativeFaceIndexesToRemove;
287 QVector<QgsMeshFace> mNativeFacesToRemove;
288 QList<int> mNativeFaceIndexesGeometryChanged;
289 QVector<QgsMeshFace> mNativeFacesGeometryChanged;
290 mutable QList<int> mTriangleIndexesGeometryChanged;
291
292 mutable int mTrianglesAddedStartIndex = 0; // defined each time the changes are apply
293 mutable QList<int> mRemovedTriangleIndexes; // defined when changes are apply the first time
294
295 friend class QgsTriangularMesh;
296 };
297
303 void applyChanges( const Changes &changes );
304
310 void reverseChanges( const Changes &changes, const QgsMesh &nativeMesh );
311
318 QgsMeshVertex nativeToTriangularCoordinates( const QgsMeshVertex &vertex ) const;
319
326 QgsMeshVertex triangularToNativeCoordinates( const QgsMeshVertex &vertex ) const;
327
334 QgsRectangle nativeExtent();
335
336 private:
337
348 void triangulate( const QgsMeshFace &face, int nativeIndex );
349
350 void addVertex( const QgsMeshVertex &vertex );
351
352 QgsMeshVertex transformVertex( const QgsMeshVertex &vertex, Qgis::TransformDirection direction ) const;
353
354 // calculate the centroid of the native mesh, mNativeMeshCentroids container must have the emplacment for the corresponding centroid before calling this method
355 QgsMeshVertex calculateCentroid( const QgsMeshFace &nativeFace ) const;
356
357 // check clock wise and calculate average size of triangles
358 void finalizeTriangles();
359
360 // vertices: map CRS; 0-N ... native vertices, N+1 - len ... extra vertices
361 // faces are derived triangles
362 QgsMesh mTriangularMesh;
363 QVector<int> mTrianglesToNativeFaces; //len(mTrianglesToNativeFaces) == len(mTriangles). Mapping derived -> native
364 QVector<int> mEdgesToNativeEdges; //len(mEdgesToNativeEdges) == len(mEdges). Mapping derived -> native
365
366 // centroids of the native faces in map CRS
367 QVector<QgsMeshVertex> mNativeMeshFaceCentroids;
368
369 // centroids of the native edges in map CRS
370 QVector<QgsMeshVertex> mNativeMeshEdgeCentroids;
371
372 QgsMeshSpatialIndex mSpatialFaceIndex;
373 QgsMeshSpatialIndex mSpatialEdgeIndex;
374 QgsCoordinateTransform mCoordinateTransform; //coordinate transform used to convert native mesh vertices to map vertices
375
376 mutable QgsRectangle mExtent;
377 mutable bool mIsExtentValid = false;
378
379 // average size of the triangles
380 double mAverageTriangleSize = 0;
381 int mLod = 0;
382
383 const QgsTriangularMesh *mBaseTriangularMesh = nullptr;
384
385 friend class TestQgsTriangularMesh;
386};
387
388
389#endif // QGSTRIANGULARMESH_H
TransformDirection
Indicates the direction (forward or inverse) of a transform.
Definition qgis.h:2619
Handles coordinate transforms between two coordinate systems.
A spatial index for QgsMeshFace or QgsMeshEdge objects.
Represents a 2D point.
Definition qgspointxy.h:60
Point geometry type, with support for z-dimension and m-values.
Definition qgspoint.h:49
A rectangle specified with double values.
Contains information about the context of a rendering operation.
Contains topological differences between two states of a topological mesh, only accessible from the Q...
Makes changes to a triangular mesh and keeps track of these changes.
Changes()=default
Default constructor, no changes.
A triangular/derived mesh with vertices in map coordinates.
QVector< int > QgsMeshFace
List of vertex indexes.
Mesh - vertices, edges and faces.
ElementType
Defines type of mesh elements.