18#ifndef QGSMESHTRACERENDERER_H
19#define QGSMESHTRACERENDERER_H
33class QgsMeshLayerInterpolator;
34class QgsMeshLayerRendererFeedback;
48class QgsMeshVectorValueInterpolator
52 QgsMeshVectorValueInterpolator(
const QgsTriangularMesh &triangularMesh,
const QgsMeshDataBlock &datasetVectorValues );
55 QgsMeshVectorValueInterpolator(
const QgsTriangularMesh &triangularMesh,
const QgsMeshDataBlock &datasetVectorValues,
const QgsMeshDataBlock &scalarActiveFaceFlagValues );
57 QgsMeshVectorValueInterpolator(
const QgsMeshVectorValueInterpolator &other );
60 virtual QgsMeshVectorValueInterpolator *clone() = 0;
62 virtual ~QgsMeshVectorValueInterpolator() =
default;
68 virtual QgsVector vectorValue(
const QgsPointXY &point )
const;
71 QgsMeshVectorValueInterpolator &operator=(
const QgsMeshVectorValueInterpolator &other );
74 void updateCacheFaceIndex(
const QgsPointXY &point )
const;
76 QgsTriangularMesh mTriangularMesh;
77 QgsMeshDataBlock mDatasetValues;
78 QgsMeshDataBlock mActiveFaceFlagValues;
80 mutable int mCacheFaceIndex = -1;
81 bool mUseScalarActiveFaceFlagValues =
false;
82 bool isVectorValid(
const QgsVector &v )
const;
85 void activeFaceFilter( QgsVector &vector,
int faceIndex )
const;
87 virtual QgsVector interpolatedValuePrivate(
int faceIndex,
const QgsPointXY point )
const = 0;
98class QgsMeshVectorValueInterpolatorFromVertex :
public QgsMeshVectorValueInterpolator
102 QgsMeshVectorValueInterpolatorFromVertex(
const QgsTriangularMesh &triangularMesh,
const QgsMeshDataBlock &datasetVectorValues );
105 QgsMeshVectorValueInterpolatorFromVertex(
const QgsTriangularMesh &triangularMesh,
const QgsMeshDataBlock &datasetVectorValues,
const QgsMeshDataBlock &scalarActiveFaceFlagValues );
107 QgsMeshVectorValueInterpolatorFromVertex(
const QgsMeshVectorValueInterpolatorFromVertex &other );
110 QgsMeshVectorValueInterpolatorFromVertex *clone()
override;
112 QgsMeshVectorValueInterpolatorFromVertex &operator=(
const QgsMeshVectorValueInterpolatorFromVertex &other );
115 QgsVector interpolatedValuePrivate(
int faceIndex,
const QgsPointXY point )
const override;
126class QgsMeshVectorValueInterpolatorFromFace :
public QgsMeshVectorValueInterpolator
130 QgsMeshVectorValueInterpolatorFromFace(
const QgsTriangularMesh &triangularMesh,
const QgsMeshDataBlock &datasetVectorValues );
133 QgsMeshVectorValueInterpolatorFromFace(
const QgsTriangularMesh &triangularMesh,
const QgsMeshDataBlock &datasetVectorValues,
const QgsMeshDataBlock &scalarActiveFaceFlagValues );
135 QgsMeshVectorValueInterpolatorFromFace(
const QgsMeshVectorValueInterpolatorFromFace &other );
138 QgsMeshVectorValueInterpolatorFromFace *clone()
override;
140 QgsMeshVectorValueInterpolatorFromFace &operator=(
const QgsMeshVectorValueInterpolatorFromFace &other );
143 QgsVector interpolatedValuePrivate(
int faceIndex,
const QgsPointXY point )
const override;
154class QgsMeshStreamField
167 const QgsTriangularMesh &triangularMesh,
168 const QgsMeshDataBlock &dataSetVectorValues,
169 const QgsMeshDataBlock &scalarActiveFaceFlagValues,
170 const QgsRectangle &layerExtent,
171 double magnitudeMaximum,
172 bool dataIsOnVertices,
173 const QgsRenderContext &rendererContext,
174 const QgsInterpolatedLineColor &vectorColoring,
178 QgsMeshStreamField(
const QgsMeshStreamField &other );
179 virtual ~QgsMeshStreamField();
187 void updateSize(
const QgsRenderContext &renderContext );
193 void updateSize(
const QgsRenderContext &renderContext,
int resolution );
196 bool isValid()
const;
202 QPoint topLeft()
const;
205 void addTrace( QPoint startPixel );
208 void addTrace( QgsPointXY startPoint );
211 void addRandomTraces();
214 void addRandomTrace();
217 void addGriddedTraces(
int dx,
int dy );
220 void addTracesOnMesh(
const QgsTriangularMesh &mesh,
const QgsRectangle &extent );
223 void setResolution(
int width );
226 int resolution()
const;
229 QSize imageSize()
const;
232 virtual QImage image()
const;
235 void setPixelFillingDensity(
double maxFilling );
238 void setColor( QColor color );
241 void setLineWidth(
double width );
244 void setFilter(
double min,
double max );
247 void setMinimizeFieldSize(
bool minimizeFieldSize );
250 QgsMeshStreamField &operator=(
const QgsMeshStreamField &other );
253 virtual void initImage();
254 QPointF fieldToDevice(
const QPoint &pixel )
const;
255 bool filterMag(
double value )
const;
256 bool isTraceOutside(
const QPoint &pixel )
const;
259 QgsPointXY positionToMapCoordinates(
const QPoint &pixelPosition,
const QgsPointXY &positionInPixel );
260 bool addPixelToChunkTrace( QPoint &pixel, QgsMeshStreamField::FieldData &data, std::list<QPair<QPoint, QgsMeshStreamField::FieldData> > &chunkTrace );
261 void setChunkTrace( std::list<QPair<QPoint, FieldData>> &chunkTrace );
262 virtual void drawTrace(
const QPoint & )
const {}
263 void clearChunkTrace( std::list<QPair<QPoint, FieldData>> &chunkTrace );
264 virtual void storeInField(
const QPair<QPoint, FieldData> pixelData ) = 0;
265 virtual void initField() = 0;
266 void simplifyChunkTrace( std::list<QPair<QPoint, FieldData>> &shunkTrace );
268 virtual bool isTraceExists(
const QPoint &pixel )
const = 0;
272 std::unique_ptr<QPainter> mPainter = std::unique_ptr<QPainter>(
nullptr );
273 int mFieldResolution = 1;
277 QgsMapToPixel mMapToFieldPixel;
278 QgsRectangle mOutputExtent = QgsRectangle();
279 QgsInterpolatedLineColor mVectorColoring;
294 QVector<unsigned char> mDirectionField;
295 QgsRenderContext mRenderContext;
298 int mPixelFillingCount = 0;
299 int mMaxPixelFillingCount = 0;
300 std::unique_ptr<QgsMeshVectorValueInterpolator> mVectorValueInterpolator;
301 QgsRectangle mLayerExtent;
302 QgsRectangle mMapExtent;
303 QPoint mFieldTopLeftInDeviceCoordinates;
305 double mMaximumMagnitude = 0;
306 double mPixelFillingDensity = 0;
307 double mMinMagFilter = -1;
308 double mMaxMagFilter = -1;
309 bool mMinimizeFieldSize =
true;
320class QgsMeshStreamlinesField :
public QgsMeshStreamField
324 Q_DECL_DEPRECATED QgsMeshStreamlinesField(
325 const QgsTriangularMesh &triangularMesh,
326 const QgsMeshDataBlock &datasetVectorValues,
327 const QgsMeshDataBlock &scalarActiveFaceFlagValues,
328 const QgsRectangle &layerExtent,
330 bool dataIsOnVertices,
331 QgsRenderContext &rendererContext,
332 const QgsInterpolatedLineColor &vectorColoring
335 QgsMeshStreamlinesField(
336 const QgsTriangularMesh &triangularMesh,
337 const QgsMeshDataBlock &datasetVectorValues,
338 const QgsMeshDataBlock &scalarActiveFaceFlagValues,
339 const QVector<double> &datasetMagValues,
340 const QgsRectangle &layerExtent,
341 QgsMeshLayerRendererFeedback *feedBack,
343 bool dataIsOnVertices,
344 QgsRenderContext &rendererContext,
345 const QgsInterpolatedLineColor &vectorColoring
351 void storeInField(
const QPair<QPoint, FieldData> pixelData )
override;
352 void initField()
override;
353 void initImage()
override;
354 bool isTraceExists(
const QPoint &pixel )
const override;
355 void drawTrace(
const QPoint &start )
const override;
357 QVector<bool> mField;
358 QImage mDrawingTraceImage;
359 std::unique_ptr<QPainter> mDrawingTracePainter;
362 QgsTriangularMesh mTriangularMesh;
363 QVector<double> mMagValues;
364 QgsMeshDataBlock mScalarActiveFaceFlagValues;
366 QgsMeshLayerRendererFeedback *mFeedBack =
nullptr;
369class QgsMeshParticleTracesField;
379struct QgsMeshTraceParticle
383 std::list<QPoint> tail;
384 double remainingTime = 0;
395class QgsMeshParticleTracesField :
public QgsMeshStreamField
399 QgsMeshParticleTracesField(
400 const QgsTriangularMesh &triangularMesh,
401 const QgsMeshDataBlock &datasetVectorValues,
402 const QgsMeshDataBlock &scalarActiveFaceFlagValues,
403 const QgsRectangle &layerExtent,
405 bool dataIsOnVertices,
406 const QgsRenderContext &rendererContext,
407 const QgsInterpolatedLineColor &vectorColoring
410 QgsMeshParticleTracesField(
const QgsMeshParticleTracesField &other );
413 void addParticle(
const QPoint &startPoint,
double lifeTime );
416 void addParticleXY(
const QgsPointXY &startPoint,
double lifeTime );
419 void addRandomParticles();
422 void moveParticles();
425 QImage imageRendered()
const;
428 void setParticlesCount(
int particlesCount );
431 void setParticlesLifeTime(
double particlesLifeTime );
441 void setStumpFactor(
int sf );
444 void setTimeStep(
double timeStep );
447 void setParticleSize(
double particleSize );
450 void setTailFactor(
double tailFactor );
453 void setMinTailLength(
int minTailLength );
456 void setStumpParticleWithLifeTime(
bool stumpParticleWithLifeTime );
459 void setParticlesColor(
const QColor &
c );
461 QgsMeshParticleTracesField &operator=(
const QgsMeshParticleTracesField &other );
464 QPoint direction( QPoint position )
const;
466 float time( QPoint position )
const;
467 float magnitude( QPoint position )
const;
469 void drawParticleTrace(
const QgsMeshTraceParticle &particle );
471 void storeInField(
const QPair<QPoint, FieldData> pixelData )
override;
472 void initField()
override;
473 bool isTraceExists(
const QPoint &pixel )
const override;
482 QVector<float> mTimeField;
483 QVector<float> mMagnitudeField;
485 QList<QgsMeshTraceParticle> mParticles;
488 double mTimeStep = 200;
489 double mParticlesLifeTime = 5000;
490 int mParticlesCount = 1000;
491 double mTailFactor = 5;
492 int mMinTailLength = 3;
493 QColor mParticleColor = Qt::white;
494 double mParticleSize = 2.5;
495 int mStumpFactor = 50;
496 bool mStumpParticleWithLifeTime =
true;
509class QgsMeshVectorStreamlineRenderer :
public QgsMeshVectorRenderer
513 Q_DECL_DEPRECATED QgsMeshVectorStreamlineRenderer(
514 const QgsTriangularMesh &triangularMesh,
515 const QgsMeshDataBlock &dataSetVectorValues,
516 const QgsMeshDataBlock &scalarActiveFaceFlagValues,
517 bool dataIsOnVertices,
518 const QgsMeshRendererVectorSettings &settings,
519 QgsRenderContext &rendererContext,
520 const QgsRectangle &layerExtent,
524 QgsMeshVectorStreamlineRenderer(
525 const QgsTriangularMesh &triangularMesh,
526 const QgsMeshDataBlock &dataSetVectorValues,
527 const QgsMeshDataBlock &scalarActiveFaceFlagValues,
528 const QVector<double> &datasetMagValues,
529 bool dataIsOnVertices,
530 const QgsMeshRendererVectorSettings &settings,
531 QgsRenderContext &rendererContext,
532 const QgsRectangle &layerExtent,
533 QgsMeshLayerRendererFeedback *feedBack,
537 void draw()
override;
540 std::unique_ptr<QgsMeshStreamlinesField> mStreamlineField;
541 QgsRenderContext &mRendererContext;
555class QgsMeshVectorTraceRenderer :
public QgsMeshVectorRenderer
559 QgsMeshVectorTraceRenderer(
560 const QgsTriangularMesh &triangularMesh,
561 const QgsMeshDataBlock &dataSetVectorValues,
562 const QgsMeshDataBlock &scalarActiveFaceFlagValues,
563 bool dataIsOnVertices,
564 const QgsMeshRendererVectorSettings &settings,
565 QgsRenderContext &rendererContext,
566 const QgsRectangle &layerExtent,
570 void draw()
override;
573 std::unique_ptr<QgsMeshParticleTracesField> mParticleField;
574 QgsRenderContext &mRendererContext;
599 bool dataIsOnVertices,
646 std::unique_ptr<QgsMeshParticleTracesField> mParticleField;
650 double mParticleLifeTime = 5;
652 void updateFieldParameter();
A block of integers/doubles from a mesh dataset.
Represents a mesh layer supporting display of data on structured or unstructured meshes.
Represents a renderer settings for vector datasets.
void setParticlesLifeTime(double particleLifeTime)
Sets maximum life time of particles in seconds.
QgsMeshVectorTraceAnimationGenerator & operator=(const QgsMeshVectorTraceAnimationGenerator &other)
void setMinimumTailLength(int l)
Sets the minimum tail length.
QgsMeshVectorTraceAnimationGenerator(const QgsMeshVectorTraceAnimationGenerator &other)
void setTailPersitence(double p)
Sets the visual persistence of the tail.
void setParticlesColor(const QColor &c)
Sets colors of particle.
QImage imageRendered()
Moves all the particles using frame per second (fps) to calculate the displacement and return the ren...
QgsMeshVectorTraceAnimationGenerator(QgsMeshLayer *layer, const QgsRenderContext &rendererContext)
Constructor to use with Python binding.
void setTailFactor(double fct)
Sets the tail factor, used to adjust the length of the tail. 0 : minimum length, >1 increase the tail...
~QgsMeshVectorTraceAnimationGenerator()=default
void setFPS(int FPS)
Sets the number of frames per seconds that will be rendered.
QgsMeshVectorTraceAnimationGenerator(const QgsTriangularMesh &triangularMesh, const QgsMeshDataBlock &dataSetVectorValues, const QgsMeshDataBlock &scalarActiveFaceFlagValues, bool dataIsOnVertices, const QgsRenderContext &rendererContext, const QgsRectangle &layerExtent, double magMax, const QgsMeshRendererVectorSettings &vectorSettings)
Constructor to use from QgsMeshVectorRenderer.
void setParticlesSize(double width)
Sets particle size in px.
void setMaxSpeedPixel(int max)
Sets the max number of pixels that can be go through by the particles in 1 second.
void seedRandomParticles(int count)
seeds particles in the vector fields
A rectangle specified with double values.
Contains information about the context of a rendering operation.
A triangular/derived mesh with vertices in map coordinates.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
QVector< int > QgsMeshFace
List of vertex indexes.