QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
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:
58
65 bool update( QgsMesh *nativeMesh, const QgsCoordinateTransform &transform );
66
77 bool update( QgsMesh *nativeMesh );
78
85 const QVector<QgsMeshVertex> &vertices() const ;
86
88 const QVector<QgsMeshFace> &triangles() const ;
89
91 const QVector<QgsMeshEdge> &edges() const ;
92
98 Q_DECL_DEPRECATED const QVector<QgsMeshVertex> &centroids() const ;
99
104 const QVector<QgsMeshVertex> &faceCentroids() const ;
105
110 const QVector<QgsMeshVertex> &edgeCentroids() const ;
111
113 const QVector<int> &trianglesToNativeFaces() const ;
114
116 const QVector<int> &edgesToNativeEdges() const ;
117
126 QgsPointXY transformFromLayerToTrianglesCoordinates( const QgsPointXY &point ) const;
127
137 int faceIndexForPoint( const QgsPointXY &point ) const ;
138
148 int faceIndexForPoint_v2( const QgsPointXY &point ) const;
149
159 int nativeFaceIndexForPoint( const QgsPointXY &point ) const ;
160
170 QList<int> nativeFaceIndexForRectangle( const QgsRectangle &rectangle ) const ;
171
181 QList<int> faceIndexesForRectangle( const QgsRectangle &rectangle ) const ;
182
190 QList<int> edgeIndexesForRectangle( const QgsRectangle &rectangle ) const ;
191
200 QVector<QVector3D> vertexNormals( float vertScale ) const;
201
217 QVector<QgsTriangularMesh *> simplifyMesh( double reductionFactor, int minimumTrianglesCount = 10 ) const;
218
225 double averageTriangleSize() const;
226
237 int levelOfDetail() const;
238
246 QgsRectangle extent() const;
247
252 bool contains( const QgsMesh::ElementType &type ) const;
253
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
319
327
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 );
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
388namespace QgsMeshUtils
389{
391 CORE_EXPORT QgsGeometry toGeometry( const QgsMeshFace &face, const QVector<QgsMeshVertex> &vertices );
392
394 CORE_EXPORT QgsMeshVertex centroid( const QgsMeshFace &face, const QVector<QgsMeshVertex> &vertices );
395
397 CORE_EXPORT std::unique_ptr< QgsPolygon > toPolygon( const QgsMeshFace &face, const QVector<QgsMeshVertex> &vertices );
398
403 CORE_EXPORT QSet<int> nativeFacesFromTriangles( const QList<int> &triangleIndexes, const QVector<int> &trianglesToNativeFaces );
404
409 CORE_EXPORT QSet<int> nativeEdgesFromEdges( const QList<int> &edgesIndexes, const QVector<int> &edgesToNativeEdges );
410
415 CORE_EXPORT QSet<int> nativeVerticesFromTriangles( const QList<int> &triangleIndexes, const QVector<QgsMeshFace> &triangles );
416
421 CORE_EXPORT QSet<int> nativeVerticesFromEdges( const QList<int> &edgesIndexes, const QVector<QgsMeshEdge> &edges );
422
427 bool isInTriangleFace( const QgsPointXY point, const QgsMeshFace &face, const QVector<QgsMeshVertex> &vertices );
428
433 void setCounterClockwise( QgsMeshFace &triangle, const QgsMeshVertex &v0, const QgsMeshVertex &v1, const QgsMeshVertex &v2 );
434
435};
436
437#endif // QGSTRIANGULARMESH_H
TransformDirection
Indicates the direction (forward or inverse) of a transform.
Definition: qgis.h:2191
Class for doing transforms between two map coordinate systems.
A geometry is the spatial representation of a feature.
Definition: qgsgeometry.h:162
A spatial index for QgsMeshFace or QgsMeshEdge objects.
A class to represent 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.
Definition: qgsrectangle.h:42
Contains information about the context of a rendering operation.
Class that contains topological differences between two states of a topological mesh,...
The Changes class is used to make changes of the triangular and to keep traces of this changes If a C...
Changes()=default
Default constructor, no changes.
Triangular/Derived Mesh is mesh with vertices in map coordinates.
QgsRectangle nativeExtent()
Returns the extent of the mesh in the native mesh coordinates system, returns empty extent if the tra...
QgsTriangularMesh()
Ctor.
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)
QgsMeshVertex triangularToNativeCoordinates(const QgsMeshVertex &vertex) const
Transforms the vertex from triangular mesh coordinates system to native coordinates system.
QgsMeshVertex nativeToTriangularCoordinates(const QgsMeshVertex &vertex) const
Transforms the vertex from native coordinates system to triangular mesh coordinates system.
~QgsTriangularMesh()
Dtor.
bool isInTriangleFace(const QgsPointXY point, const QgsMeshFace &face, const QVector< QgsMeshVertex > &vertices)
Tests if point p is on the face defined with vertices.
CORE_EXPORT QSet< int > nativeEdgesFromEdges(const QList< int > &edgesIndexes, const QVector< int > &edgesToNativeEdges)
Returns unique native faces indexes from list of triangle indexes.
CORE_EXPORT std::unique_ptr< QgsPolygon > toPolygon(const QgsMeshFace &face, const QVector< QgsMeshVertex > &vertices)
Returns face as polygon geometry, caller is responsible for delete.
CORE_EXPORT QgsGeometry toGeometry(const QgsMeshFace &face, const QVector< QgsMeshVertex > &vertices)
Returns face as polygon geometry.
void setCounterClockwise(QgsMeshFace &triangle, const QgsMeshVertex &v0, const QgsMeshVertex &v1, const QgsMeshVertex &v2)
Checks if the triangle is counter clockwise, if not sets it counter clockwise.
CORE_EXPORT QSet< int > nativeVerticesFromEdges(const QList< int > &edgesIndexes, const QVector< QgsMeshEdge > &edges)
Returns unique native faces indexes from list of vertices of triangles.
CORE_EXPORT QgsMeshVertex centroid(const QgsMeshFace &face, const QVector< QgsMeshVertex > &vertices)
Returns the centroid of the face.
CORE_EXPORT QSet< int > nativeVerticesFromTriangles(const QList< int > &triangleIndexes, const QVector< QgsMeshFace > &triangles)
Returns unique native vertex indexes from list of vertices of triangles.
CORE_EXPORT QSet< int > nativeFacesFromTriangles(const QList< int > &triangleIndexes, const QVector< int > &trianglesToNativeFaces)
Returns unique native faces indexes from list of triangle indexes.
QVector< int > QgsMeshFace
List of vertex indexes.
Mesh - vertices, edges and faces.
ElementType
Defines type of mesh elements.