QGIS API Documentation 3.39.0-Master (47f7b3a4989)
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 <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
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 );
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:2289
Class for doing transforms between two map coordinate systems.
A geometry is the spatial representation of a feature.
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.
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.
QgsTriangularMesh()
Ctor.
~QgsTriangularMesh()
Dtor.
QVector< int > QgsMeshFace
List of vertex indexes.
Mesh - vertices, edges and faces.
ElementType
Defines type of mesh elements.