QGIS API Documentation 3.99.0-Master (a8f284845db)
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
23#include <memory>
24
25#include "qgis_core.h"
27#include "qgsgeometry.h"
28#include "qgsmeshdataprovider.h"
29#include "qgsmeshspatialindex.h"
30#include "qgstopologicalmesh.h"
31
32#include <QList>
33#include <QSet>
34#include <QVector>
35#include <QVector3D>
36
37#define SIP_NO_FILE
38
40class QgsRectangle;
41
54class CORE_EXPORT QgsTriangularMesh // TODO rename to QgsRendererMesh in QGIS 5
55{
56 public:
57
60
67 bool update( QgsMesh *nativeMesh, const QgsCoordinateTransform &transform );
68
79 bool update( QgsMesh *nativeMesh );
80
87 const QVector<QgsMeshVertex> &vertices() const ;
88
90 const QVector<QgsMeshFace> &triangles() const ;
91
93 const QVector<QgsMeshEdge> &edges() const ;
94
100 Q_DECL_DEPRECATED const QVector<QgsMeshVertex> &centroids() const ;
101
106 const QVector<QgsMeshVertex> &faceCentroids() const ;
107
112 const QVector<QgsMeshVertex> &edgeCentroids() const ;
113
115 const QVector<int> &trianglesToNativeFaces() const ;
116
118 const QVector<int> &edgesToNativeEdges() const ;
119
129
139 int faceIndexForPoint( const QgsPointXY &point ) const ;
140
150 int faceIndexForPoint_v2( const QgsPointXY &point ) const;
151
161 int nativeFaceIndexForPoint( const QgsPointXY &point ) const ;
162
172 QList<int> nativeFaceIndexForRectangle( const QgsRectangle &rectangle ) const ;
173
183 QList<int> faceIndexesForRectangle( const QgsRectangle &rectangle ) const ;
184
192 QList<int> edgeIndexesForRectangle( const QgsRectangle &rectangle ) const ;
193
201
202 QVector<QVector3D> vertexNormals( float vertScale ) const;
203
219 QVector<QgsTriangularMesh *> simplifyMesh( double reductionFactor, int minimumTrianglesCount = 10 ) const;
220
227 double averageTriangleSize() const;
228
239 int levelOfDetail() const;
240
248 QgsRectangle extent() const;
249
254 bool contains( const QgsMesh::ElementType &type ) const;
255
267 {
268 public:
269
271 Changes() = default;
272
276 Changes( const QgsTopologicalMesh::Changes &topologicalChanges, const QgsMesh &nativeMesh );
277
278 private:
279 // triangular mesh elements that can be changed if the triangular mesh is updated, are not stored and have to be retrieve
280 QVector<QgsMeshVertex> mAddedVertices;
281 QList<int> mVerticesIndexesToRemove;
282 QList<int> mChangedVerticesCoordinates;
283 mutable QList<double> mOldZValue;
284 QList<double> mNewZValue;
285 QList<QgsPointXY> mOldXYValue;
286 QList<QgsPointXY> mNewXYValue;
287
288 QVector<QgsMeshFace> mNativeFacesToAdd;
289 QList<int> mNativeFaceIndexesToRemove;
290 QVector<QgsMeshFace> mNativeFacesToRemove;
291 QList<int> mNativeFaceIndexesGeometryChanged;
292 QVector<QgsMeshFace> mNativeFacesGeometryChanged;
293 mutable QList<int> mTriangleIndexesGeometryChanged;
294
295 mutable int mTrianglesAddedStartIndex = 0; // defined each time the changes are apply
296 mutable QList<int> mRemovedTriangleIndexes; // defined when changes are apply the first time
297
298 friend class QgsTriangularMesh;
299 };
300
306 void applyChanges( const Changes &changes );
307
313 void reverseChanges( const Changes &changes, const QgsMesh &nativeMesh );
314
322
330
338
339 private:
340
351 void triangulate( const QgsMeshFace &face, int nativeIndex );
352
353 void addVertex( const QgsMeshVertex &vertex );
354
355 QgsMeshVertex transformVertex( const QgsMeshVertex &vertex, Qgis::TransformDirection direction ) const;
356
357 // calculate the centroid of the native mesh, mNativeMeshCentroids container must have the emplacment for the corresponding centroid before calling this method
358 QgsMeshVertex calculateCentroid( const QgsMeshFace &nativeFace ) const;
359
360 // check clock wise and calculate average size of triangles
361 void finalizeTriangles();
362
363 // vertices: map CRS; 0-N ... native vertices, N+1 - len ... extra vertices
364 // faces are derived triangles
365 QgsMesh mTriangularMesh;
366 QVector<int> mTrianglesToNativeFaces; //len(mTrianglesToNativeFaces) == len(mTriangles). Mapping derived -> native
367 QVector<int> mEdgesToNativeEdges; //len(mEdgesToNativeEdges) == len(mEdges). Mapping derived -> native
368
369 // centroids of the native faces in map CRS
370 QVector<QgsMeshVertex> mNativeMeshFaceCentroids;
371
372 // centroids of the native edges in map CRS
373 QVector<QgsMeshVertex> mNativeMeshEdgeCentroids;
374
375 QgsMeshSpatialIndex mSpatialFaceIndex;
376 QgsMeshSpatialIndex mSpatialEdgeIndex;
377 QgsCoordinateTransform mCoordinateTransform; //coordinate transform used to convert native mesh vertices to map vertices
378
379 mutable QgsRectangle mExtent;
380 mutable bool mIsExtentValid = false;
381
382 // average size of the triangles
383 double mAverageTriangleSize = 0;
384 int mLod = 0;
385
386 const QgsTriangularMesh *mBaseTriangularMesh = nullptr;
387
389};
390
391
392#endif // QGSTRIANGULARMESH_H
TransformDirection
Indicates the direction (forward or inverse) of a transform.
Definition qgis.h:2744
Handles coordinate transforms between two coordinate systems.
A spatial index for QgsMeshFace or QgsMeshEdge objects.
Represents a 2D point.
Definition qgspointxy.h:62
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.