18#ifndef QGSVECTORFIELDSTREAMFIELD_H
19#define QGSVECTORFIELDSTREAMFIELD_H
55class QgsVectorFieldStreamField
67 QgsVectorFieldStreamField( std::unique_ptr<QgsVectorFieldValueSource> source,
const QgsRenderContext &rendererContext,
const QgsInterpolatedLineColor &vectorColoring,
int resolution = 1 );
69 QgsVectorFieldStreamField(
const QgsVectorFieldStreamField &other );
70 virtual ~QgsVectorFieldStreamField();
78 void updateSize(
const QgsRenderContext &renderContext );
84 void updateSize(
const QgsRenderContext &renderContext,
int resolution );
93 QPoint topLeft()
const;
96 void addTrace( QPoint startPixel );
99 void addTrace( QgsPointXY startPoint );
102 void addRandomTraces();
105 void addRandomTrace();
108 void addGriddedTraces(
int dx,
int dy );
116 void addTracesOnDataPoints(
const QgsRectangle &extent );
119 void setResolution(
int width );
122 int resolution()
const;
125 QSize imageSize()
const;
128 virtual QImage image()
const;
131 void setPixelFillingDensity(
double maxFilling );
134 void setColor( QColor color );
137 void setLineWidth(
double width );
140 void setFilter(
double min,
double max );
143 void setMinimizeFieldSize(
bool minimizeFieldSize );
146 QgsVectorFieldStreamField &operator=(
const QgsVectorFieldStreamField &other );
149 virtual void initImage();
150 QPointF fieldToDevice(
const QPoint &pixel )
const;
159 bool filterMag(
double value )
const;
160 bool isTraceOutside(
const QPoint &pixel )
const;
163 QgsPointXY positionToMapCoordinates(
const QPoint &pixelPosition,
const QgsPointXY &positionInPixel );
164 bool addPixelToChunkTrace( QPoint &pixel, QgsVectorFieldStreamField::FieldData &data, std::list<QPair<QPoint, QgsVectorFieldStreamField::FieldData> > &chunkTrace );
165 void setChunkTrace( std::list<QPair<QPoint, FieldData>> &chunkTrace );
166 virtual void drawTrace(
const QPoint & )
const {}
167 void clearChunkTrace( std::list<QPair<QPoint, FieldData>> &chunkTrace );
168 virtual void storeInField(
const QPair<QPoint, FieldData> pixelData ) = 0;
169 virtual void initField() = 0;
170 void simplifyChunkTrace( std::list<QPair<QPoint, FieldData>> &shunkTrace );
172 virtual bool isTraceExists(
const QPoint &pixel )
const = 0;
176 std::unique_ptr<QPainter> mPainter = std::unique_ptr<QPainter>(
nullptr );
177 int mFieldResolution = 1;
181 QgsMapToPixel mMapToFieldPixel;
182 QgsRectangle mOutputExtent = QgsRectangle();
183 QgsInterpolatedLineColor mVectorColoring;
198 QVector<unsigned char> mDirectionField;
199 QgsRenderContext mRenderContext;
201 std::unique_ptr<QgsVectorFieldValueSource> mSource;
204 int mPixelFillingCount = 0;
205 int mMaxPixelFillingCount = 0;
206 QgsRectangle mMapExtent;
207 QPoint mFieldTopLeftInDeviceCoordinates;
209 double mPixelFillingDensity = 0;
210 double mMinMagFilter = -1;
211 double mMaxMagFilter = -1;
212 bool mMinimizeFieldSize =
true;
223class QgsVectorFieldStreamlinesField :
public QgsVectorFieldStreamField
227 QgsVectorFieldStreamlinesField(
228 std::unique_ptr<QgsVectorFieldValueSource> source, QgsRenderContext &rendererContext,
const QgsInterpolatedLineColor &vectorColoring, QgsRasterBlockFeedback *feedBack =
nullptr
234 void storeInField(
const QPair<QPoint, FieldData> pixelData )
override;
235 void initField()
override;
236 void initImage()
override;
237 bool isTraceExists(
const QPoint &pixel )
const override;
238 void drawTrace(
const QPoint &start )
const override;
240 QVector<bool> mField;
241 QImage mDrawingTraceImage;
242 std::unique_ptr<QPainter> mDrawingTracePainter;
244 QgsRasterBlockFeedback *mFeedBack =
nullptr;
255struct QgsVectorFieldTraceParticle
259 std::list<QPoint> tail;
260 double remainingTime = 0;
271class QgsVectorFieldParticleTracesField :
public QgsVectorFieldStreamField
275 QgsVectorFieldParticleTracesField( std::unique_ptr<QgsVectorFieldValueSource> source,
const QgsRenderContext &rendererContext,
const QgsInterpolatedLineColor &vectorColoring );
277 QgsVectorFieldParticleTracesField(
const QgsVectorFieldParticleTracesField &other );
280 void addParticle(
const QPoint &startPoint,
double lifeTime );
283 void addParticleXY(
const QgsPointXY &startPoint,
double lifeTime );
286 void addRandomParticles();
289 void moveParticles();
292 QImage imageRendered()
const;
295 void setParticlesCount(
int particlesCount );
298 void setParticlesLifeTime(
double particlesLifeTime );
308 void setStumpFactor(
int sf );
311 void setTimeStep(
double timeStep );
314 void setParticleSize(
double particleSize );
317 void setTailFactor(
double tailFactor );
320 void setMinTailLength(
int minTailLength );
323 void setStumpParticleWithLifeTime(
bool stumpParticleWithLifeTime );
326 void setParticlesColor(
const QColor &
c );
328 QgsVectorFieldParticleTracesField &operator=(
const QgsVectorFieldParticleTracesField &other );
331 QPoint direction( QPoint position )
const;
333 float time( QPoint position )
const;
334 float magnitude( QPoint position )
const;
336 void drawParticleTrace(
const QgsVectorFieldTraceParticle &particle );
338 void storeInField(
const QPair<QPoint, FieldData> pixelData )
override;
339 void initField()
override;
340 bool isTraceExists(
const QPoint &pixel )
const override;
349 QVector<float> mTimeField;
350 QVector<float> mMagnitudeField;
352 QList<QgsVectorFieldTraceParticle> mParticles;
355 double mTimeStep = 200;
356 double mParticlesLifeTime = 5000;
357 int mParticlesCount = 1000;
358 double mTailFactor = 5;
359 int mMinTailLength = 3;
360 QColor mParticleColor = Qt::white;
361 double mParticleSize = 2.5;
362 int mStumpFactor = 50;
363 bool mStumpParticleWithLifeTime =
true;
Feedback object tailored for raster block reading.
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