QGIS API Documentation 3.99.0-Master (2fe06baccd8)
Loading...
Searching...
No Matches
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 <memory>
25
26#include "qgis_core.h"
28#include "qgsgeometry.h"
29#include "qgsmeshdataprovider.h"
30#include "qgsmeshspatialindex.h"
31#include "qgstopologicalmesh.h"
32
33#include <QList>
34#include <QSet>
35#include <QVector>
36#include <QVector3D>
37
39class QgsRectangle;
40
53class CORE_EXPORT QgsTriangularMesh // TODO rename to QgsRendererMesh in QGIS 4
54{
55 public:
56
59
66 bool update( QgsMesh *nativeMesh, const QgsCoordinateTransform &transform );
67
78 bool update( QgsMesh *nativeMesh );
79
86 const QVector<QgsMeshVertex> &vertices() const ;
87
89 const QVector<QgsMeshFace> &triangles() const ;
90
92 const QVector<QgsMeshEdge> &edges() const ;
93
99 Q_DECL_DEPRECATED const QVector<QgsMeshVertex> &centroids() const ;
100
105 const QVector<QgsMeshVertex> &faceCentroids() const ;
106
111 const QVector<QgsMeshVertex> &edgeCentroids() const ;
112
114 const QVector<int> &trianglesToNativeFaces() const ;
115
117 const QVector<int> &edgesToNativeEdges() const ;
118
128
138 int faceIndexForPoint( const QgsPointXY &point ) const ;
139
149 int faceIndexForPoint_v2( const QgsPointXY &point ) const;
150
160 int nativeFaceIndexForPoint( const QgsPointXY &point ) const ;
161
171 QList<int> nativeFaceIndexForRectangle( const QgsRectangle &rectangle ) const ;
172
182 QList<int> faceIndexesForRectangle( const QgsRectangle &rectangle ) const ;
183
191 QList<int> edgeIndexesForRectangle( const QgsRectangle &rectangle ) const ;
192
200
201 QVector<QVector3D> vertexNormals( float vertScale ) const;
202
218 QVector<QgsTriangularMesh *> simplifyMesh( double reductionFactor, int minimumTrianglesCount = 10 ) const;
219
226 double averageTriangleSize() const;
227
238 int levelOfDetail() const;
239
247 QgsRectangle extent() const;
248
253 bool contains( const QgsMesh::ElementType &type ) const;
254
266 {
267 public:
268
270 Changes() = default;
271
275 Changes( const QgsTopologicalMesh::Changes &topologicalChanges, const QgsMesh &nativeMesh );
276
277 private:
278 // triangular mesh elements that can be changed if the triangular mesh is updated, are not stored and have to be retrieve
279 QVector<QgsMeshVertex> mAddedVertices;
280 QList<int> mVerticesIndexesToRemove;
281 QList<int> mChangedVerticesCoordinates;
282 mutable QList<double> mOldZValue;
283 QList<double> mNewZValue;
284 QList<QgsPointXY> mOldXYValue;
285 QList<QgsPointXY> mNewXYValue;
286
287 QVector<QgsMeshFace> mNativeFacesToAdd;
288 QList<int> mNativeFaceIndexesToRemove;
289 QVector<QgsMeshFace> mNativeFacesToRemove;
290 QList<int> mNativeFaceIndexesGeometryChanged;
291 QVector<QgsMeshFace> mNativeFacesGeometryChanged;
292 mutable QList<int> mTriangleIndexesGeometryChanged;
293
294 mutable int mTrianglesAddedStartIndex = 0; // defined each time the changes are apply
295 mutable QList<int> mRemovedTriangleIndexes; // defined when changes are apply the first time
296
297 friend class QgsTriangularMesh;
298 };
299
305 void applyChanges( const Changes &changes );
306
312 void reverseChanges( const Changes &changes, const QgsMesh &nativeMesh );
313
321
329
337
338 private:
339
350 void triangulate( const QgsMeshFace &face, int nativeIndex );
351
352 void addVertex( const QgsMeshVertex &vertex );
353
354 QgsMeshVertex transformVertex( const QgsMeshVertex &vertex, Qgis::TransformDirection direction ) const;
355
356 // calculate the centroid of the native mesh, mNativeMeshCentroids container must have the emplacment for the corresponding centroid before calling this method
357 QgsMeshVertex calculateCentroid( const QgsMeshFace &nativeFace ) const;
358
359 // check clock wise and calculate average size of triangles
360 void finalizeTriangles();
361
362 // vertices: map CRS; 0-N ... native vertices, N+1 - len ... extra vertices
363 // faces are derived triangles
364 QgsMesh mTriangularMesh;
365 QVector<int> mTrianglesToNativeFaces; //len(mTrianglesToNativeFaces) == len(mTriangles). Mapping derived -> native
366 QVector<int> mEdgesToNativeEdges; //len(mEdgesToNativeEdges) == len(mEdges). Mapping derived -> native
367
368 // centroids of the native faces in map CRS
369 QVector<QgsMeshVertex> mNativeMeshFaceCentroids;
370
371 // centroids of the native edges in map CRS
372 QVector<QgsMeshVertex> mNativeMeshEdgeCentroids;
373
374 QgsMeshSpatialIndex mSpatialFaceIndex;
375 QgsMeshSpatialIndex mSpatialEdgeIndex;
376 QgsCoordinateTransform mCoordinateTransform; //coordinate transform used to convert native mesh vertices to map vertices
377
378 mutable QgsRectangle mExtent;
379 mutable bool mIsExtentValid = false;
380
381 // average size of the triangles
382 double mAverageTriangleSize = 0;
383 int mLod = 0;
384
385 const QgsTriangularMesh *mBaseTriangularMesh = nullptr;
386
388};
389
390
391#endif // QGSTRIANGULARMESH_H
TransformDirection
Indicates the direction (forward or inverse) of a transform.
Definition qgis.h:2671
Handles coordinate transforms between two coordinate systems.
A spatial index for QgsMeshFace or QgsMeshEdge objects.
Represents a 2D point.
Definition qgspointxy.h:60
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.
const QVector< QgsMeshVertex > & edgeCentroids() const
Returns centroids of the native edges in map CRS.
friend class TestQgsTriangularMesh
const QVector< QgsMeshFace > & triangles() const
Returns triangles.
QVector< QgsTriangularMesh * > simplifyMesh(double reductionFactor, int minimumTrianglesCount=10) const
Returns simplified meshes.
QgsRectangle nativeExtent()
Returns the extent of the mesh in the native mesh coordinates system, returns empty extent if the tra...
QgsPointXY transformFromLayerToTrianglesCoordinates(const QgsPointXY &point) const
Transforms a point from layer coordinates system to triangular Mesh coordinates system.
int levelOfDetail() const
Returns the corresponding index of level of detail on which this mesh is associated.
QgsRectangle extent() const
Returns the extent of the triangular mesh in map coordinates.
int faceIndexForPoint(const QgsPointXY &point) const
Finds index of triangle at given point It uses spatial indexing.
int nativeFaceIndexForPoint(const QgsPointXY &point) const
Finds index of native face at given point It uses spatial indexing.
double averageTriangleSize() const
Returns the average size of triangles in map unit.
void reverseChanges(const Changes &changes, const QgsMesh &nativeMesh)
Reverses the changes on the triangular mesh (see Changes).
void applyChanges(const Changes &changes)
Applies the changes on the triangular mesh (see Changes).
QList< int > edgeIndexesForRectangle(const QgsRectangle &rectangle) const
Finds indexes of edges intersecting given bounding box It uses spatial indexing.
Q_DECL_DEPRECATED const QVector< QgsMeshVertex > & centroids() const
Returns centroids of the native faces in map CRS.
const QVector< QgsMeshVertex > & vertices() const
Returns vertices in map coordinate system.
const QVector< QgsMeshEdge > & edges() const
Returns edges.
bool contains(const QgsMesh::ElementType &type) const
Returns whether the mesh contains mesh elements of given type.
QgsMeshVertex triangularToNativeCoordinates(const QgsMeshVertex &vertex) const
Transforms the vertex from triangular mesh coordinates system to native coordinates system.
QVector< QVector3D > vertexNormals(float vertScale) const
Calculates and returns normal vector on each vertex that is part of any face.
QgsMeshVertex nativeToTriangularCoordinates(const QgsMeshVertex &vertex) const
Transforms the vertex from native coordinates system to triangular mesh coordinates system.
bool update(QgsMesh *nativeMesh, const QgsCoordinateTransform &transform)
Constructs triangular mesh from layer's native mesh and transform to destination CRS.
const QVector< QgsMeshVertex > & faceCentroids() const
Returns centroids of the native faces in map CRS.
QList< int > nativeFaceIndexForRectangle(const QgsRectangle &rectangle) const
Finds indexes of native faces which bounding boxes intersect given bounding box It uses spatial index...
const QVector< int > & trianglesToNativeFaces() const
Returns mapping between triangles and original faces.
const QVector< int > & edgesToNativeEdges() const
Returns mapping between edges and original edges.
QList< int > faceIndexesForRectangle(const QgsRectangle &rectangle) const
Finds indexes of triangles intersecting given bounding box It uses spatial indexing.
int faceIndexForPoint_v2(const QgsPointXY &point) const
Finds index of triangle at given point It uses spatial indexing and don't use geos to be faster.
QVector< int > QgsMeshFace
List of vertex indexes.
QgsPoint QgsMeshVertex
xyz coords of vertex
Mesh - vertices, edges and faces.
ElementType
Defines type of mesh elements.