25QgsMeshVectorFieldValueSource::QgsMeshVectorFieldValueSource(
29 const QVector<double> &datasetMagnitudeValues,
32 double maximumMagnitude
34 : mTriangularMesh( triangularMesh )
35 , mDatasetValues( datasetVectorValues )
36 , mActiveFaceFlagValues( scalarActiveFaceFlagValues )
37 , mMagnitudeValues( datasetMagnitudeValues )
38 , mDataType( dataType )
39 , mExtent( layerExtent )
40 , mMaximumMagnitude( maximumMagnitude )
41 , mUseScalarActiveFaceFlagValues( scalarActiveFaceFlagValues.isValid() )
44std::unique_ptr<QgsMeshVectorFieldValueSource> QgsMeshVectorFieldValueSource::create(
48 const QVector<double> &datasetMagnitudeValues,
51 double maximumMagnitude
55 return std::make_unique<
58 return std::make_unique<
59 QgsMeshVectorFieldValueSourceFromFace>( triangularMesh, datasetVectorValues, scalarActiveFaceFlagValues, datasetMagnitudeValues,
QgsMeshDatasetGroupMetadata::DataOnFaces, layerExtent, maximumMagnitude );
64 if ( mCacheFaceIndex != -1 && mCacheFaceIndex < mTriangularMesh.triangles().count() )
66 QgsVector res = interpolatedValuePrivate( mCacheFaceIndex, point );
67 if ( isVectorValid( res ) )
69 activeFaceFilter( res, mCacheFaceIndex );
75 QList<int> potentialFaceIndexes = mTriangularMesh.faceIndexesForRectangle(
QgsRectangle( point, point ) );
77 for (
const int faceIndex : potentialFaceIndexes )
79 QgsVector res = interpolatedValuePrivate( faceIndex, point );
80 if ( isVectorValid( res ) )
82 mCacheFaceIndex = faceIndex;
83 activeFaceFilter( res, mCacheFaceIndex );
89 return (
QgsVector( std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN() ) );
92QgsRectangle QgsMeshVectorFieldValueSource::extent()
const
97double QgsMeshVectorFieldValueSource::maximumMagnitude()
const
99 return mMaximumMagnitude;
102QVector<QgsPointXY> QgsMeshVectorFieldValueSource::seedPoints(
const QgsRectangle &extent )
const
104 const QList<int> facesInExtent = mTriangularMesh.faceIndexesForRectangle( extent );
106 for (
const int f : facesInExtent )
108 const QgsMeshFace face = mTriangularMesh.triangles().at( f );
109 for (
const int i : face )
110 vertices.insert( i );
113 QVector<QgsPointXY> points;
114 points.reserve( vertices.count() );
115 for (
const int i : vertices )
116 points.append( mTriangularMesh.vertices().at( i ) );
121std::unique_ptr<QgsRasterInterface> QgsMeshVectorFieldValueSource::magnitudeSource(
const QgsRenderContext &context, QSize size )
const
123 if ( mMagnitudeValues.isEmpty() )
126 return std::make_unique<QgsMeshLayerInterpolator>( mTriangularMesh, mMagnitudeValues, mActiveFaceFlagValues, mDataType, context, size );
129bool QgsMeshVectorFieldValueSource::isVectorValid(
const QgsVector &v )
const
131 return !( std::isnan( v.
x() ) || std::isnan( v.
y() ) );
134void QgsMeshVectorFieldValueSource::activeFaceFilter(
QgsVector &vector,
int faceIndex )
const
136 if ( mUseScalarActiveFaceFlagValues && !mActiveFaceFlagValues.active( mTriangularMesh.trianglesToNativeFaces()[faceIndex] ) )
137 vector =
QgsVector( std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN() );
140QgsMeshVectorFieldValueSourceFromVertex *QgsMeshVectorFieldValueSourceFromVertex::clone()
const
142 return new QgsMeshVectorFieldValueSourceFromVertex( *
this );
145QgsVector QgsMeshVectorFieldValueSourceFromVertex::interpolatedValuePrivate(
int faceIndex,
const QgsPointXY point )
const
147 const QgsMeshFace face = mTriangularMesh.triangles().at( faceIndex );
153 const QgsVector v1 =
QgsVector( mDatasetValues.value( face.at( 0 ) ).x(), mDatasetValues.value( face.at( 0 ) ).y() );
154 const QgsVector v2 =
QgsVector( mDatasetValues.value( face.at( 1 ) ).x(), mDatasetValues.value( face.at( 1 ) ).y() );
155 const QgsVector v3 =
QgsVector( mDatasetValues.value( face.at( 2 ) ).x(), mDatasetValues.value( face.at( 2 ) ).y() );
157 return QgsMeshLayerUtils::interpolateVectorFromVerticesData( p1, p2, p3, v1, v2, v3, point );
160QgsMeshVectorFieldValueSourceFromFace *QgsMeshVectorFieldValueSourceFromFace::clone()
const
162 return new QgsMeshVectorFieldValueSourceFromFace( *
this );
165QgsVector QgsMeshVectorFieldValueSourceFromFace::interpolatedValuePrivate(
int faceIndex,
const QgsPointXY point )
const
167 const QgsMeshFace face = mTriangularMesh.triangles().at( faceIndex );
173 const int nativeFaceIndex = mTriangularMesh.trianglesToNativeFaces().at( faceIndex );
174 const QgsVector vect =
QgsVector( mDatasetValues.value( nativeFaceIndex ).x(), mDatasetValues.value( nativeFaceIndex ).y() );
176 return QgsMeshLayerUtils::interpolateVectorFromFacesData( p1, p2, p3, vect, point );
QgsVertexIterator vertices() const
Returns a read-only, Java-style iterator for traversal of vertices of all the geometry,...
A block of integers/doubles from a mesh dataset.
Point geometry type, with support for z-dimension and m-values.
A rectangle specified with double values.
Contains information about the context of a rendering operation.
A triangular/derived mesh with vertices in map coordinates.
Represent a 2-dimensional vector.
double y() const
Returns the vector's y-component.
double x() const
Returns the vector's x-component.
QVector< int > QgsMeshFace
List of vertex indexes.