2019-01-10 04:23:24 +08:00
/*
2020-08-26 18:58:23 +08:00
Copyright ( c ) 2008 - 2020 Jan W . Krieger ( < jan @ jkrieger . de > )
2019-01-10 04:23:24 +08:00
This software is free software : you can redistribute it and / or modify
it under the terms of the GNU Lesser General Public License ( LGPL ) as published by
2019-02-08 00:24:46 +08:00
the Free Software Foundation , either version 2.1 of the License , or
2019-01-10 04:23:24 +08:00
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU Lesser General Public License ( LGPL ) for more details .
You should have received a copy of the GNU Lesser General Public License ( LGPL )
along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
# include <QString>
# include <QPainter>
# include <QPair>
2019-06-20 22:06:31 +08:00
# include "jkqtplotter/graphs/jkqtpscatter.h"
2019-04-22 19:27:50 +08:00
# include "jkqtplotter/jkqtpgraphsbasestylingmixins.h"
2019-06-22 20:21:32 +08:00
# include "jkqtplotter/jkqtplotter_imexport.h"
2019-01-10 04:23:24 +08:00
# include <functional>
# ifndef jkqtpgraphsevaluatedfunction_H
# define jkqtpgraphsevaluatedfunction_H
/*! \brief type of functions that may be plottet
2019-01-19 16:40:52 +08:00
\ ingroup jkqtplotter_functiongraphs
2019-01-10 04:23:24 +08:00
2019-01-20 17:49:29 +08:00
This is the type of functions \ f $ y = f ( x , \ vec { p } ) \ f $ that may be plottet by JKQTPXFunctionLineGraph
and JKQTPYFunctionLineGraph . It is possible to supply parameters \ f $ \ vec { p } \ f $ to the function that
2019-01-10 04:23:24 +08:00
influence its result . Parameters are given as a pointer to some memory location . The function has to
know on its own how to interpret these .
*/
typedef std : : function < double ( double , void * ) > jkqtpPlotFunctionType ;
/*! \brief simplified type of functions (without parameters) that may be plottet
2019-01-19 16:40:52 +08:00
\ ingroup jkqtplotter_functiongraphs
2019-01-10 04:23:24 +08:00
2019-01-20 17:49:29 +08:00
This is the type of functions \ f $ y = f ( x ) \ f $ that may be plottet by JKQTPXFunctionLineGraph
and JKQTPYFunctionLineGraph .
2019-01-10 04:23:24 +08:00
*/
typedef std : : function < double ( double ) > jkqtpSimplePlotFunctionType ;
/*! \brief This implements line plots where the data is taken from a user supplied function \f$ y=f(x) \f$
2019-01-19 16:40:52 +08:00
\ ingroup jkqtplotter_functiongraphs
2019-01-10 04:23:24 +08:00
This class implements an intelligent plotting algorithm for functions . It starts by sampling
the function at minSamples positions . Then each function interval is bisected recursively if
necessary . To do so the function is evaluated at the mid point and the slopes \ f $ \ alpha_ { \ mbox { left } } \ f $
and \ f $ \ alpha_ { \ mbox { right } } \ f $ of the two linear segments are compared . the midpoint is added
to the graph if \ f [ \ left | \ alpha_ { \ mbox { right } } - \ alpha_ { \ mbox { left } } \ right | > \ mbox { slopeTolerance } \ f ]
In addition all sampling points except minimum and maximum are beeing shifted by a random fraction their
distance to the other points . This helps to prevent beats when sampling periodic functions .
the following image
\ image html plot_functionplots . png
2019-06-13 16:27:06 +08:00
\ see \ ref JKQTPlotterFunctionPlots , jkqtpstatAddPolyFit ( ) , jkqtpstatAddWeightedRegression ( ) , jkqtpstatAddRobustIRLSRegression ( ) , jkqtpstatAddRegression ( ) , jkqtpstatAddLinearWeightedRegression ( ) , jkqtpstatAddRobustIRLSLinearRegression ( ) , jkqtpstatAddLinearRegression ( )
2019-01-10 04:23:24 +08:00
*/
2019-06-22 20:21:32 +08:00
class JKQTPLOTTER_LIB_EXPORT JKQTPXFunctionLineGraph : public JKQTPGraph , public JKQTPGraphLineStyleMixin , public JKQTPGraphFillStyleMixin {
2019-01-10 04:23:24 +08:00
Q_OBJECT
public :
enum SpecialFunction {
Polynomial , /*!< \brief a polynomial \f$ f(x)=p_0+p_1x+p_2x^2+p_3x^3+... \f$ The parameters \a params have to be point to a QVector<double> and contain the parameters \f$ p_0, p_1, ... \f$ */
Line = Polynomial , /*!< \brief a polynomial \f$ f(x)=p_0+p_1x \f$ The parameters \a params have to be point to a QVector<double> and contain the parameters \f$ p_0, p_1, ... \f$ */
Exponential , /*!< \brief an exponential function \f$ f(x)=p_0+p_1\cdot\exp(x/p_2) \f$ or \f$ f(x)=p_0\cdot\exp(x/p_1) \f$ (depending on the number of parameters). The parameters \a params have to be point to a QVector<double> and contain the parameters \f$ p_0, p_1, ... \f$ */
PowerLaw , /*!< \brief an exponential function \f$ f(x)=p_0+p_1\cdot x^{p_3} \f$ or \f$ f(x)=p_0\cdot x^{p_1} \f$ or \f$ f(x)= x^{p_0} \f$ (depending on the number of parameters) The parameters \a params have to be point to a QVector<double> and contain the parameters \f$ p_0, p_1, ... \f$ */
UserFunction , /*!< \brief no special function but the function is provided by the user */
} ;
/** \brief class constructor */
2019-01-20 17:49:29 +08:00
JKQTPXFunctionLineGraph ( JKQTBasePlotter * parent = nullptr ) ;
2019-01-10 04:23:24 +08:00
/** \brief class constructor */
2019-01-20 23:15:10 +08:00
JKQTPXFunctionLineGraph ( JKQTPlotter * parent ) ;
2019-05-30 04:40:02 +08:00
/** \brief class constructor */
JKQTPXFunctionLineGraph ( const jkqtpSimplePlotFunctionType & f , const QString & title , JKQTBasePlotter * parent = nullptr ) ;
/** \brief class constructor */
JKQTPXFunctionLineGraph ( const jkqtpSimplePlotFunctionType & f , const QString & title , JKQTPlotter * parent ) ;
/** \brief class constructor */
JKQTPXFunctionLineGraph ( jkqtpSimplePlotFunctionType & & f , const QString & title , JKQTBasePlotter * parent = nullptr ) ;
/** \brief class constructor */
JKQTPXFunctionLineGraph ( jkqtpSimplePlotFunctionType & & f , const QString & title , JKQTPlotter * parent ) ;
2019-01-10 04:23:24 +08:00
/** \brief class destructor */
2019-04-22 19:27:50 +08:00
virtual ~ JKQTPXFunctionLineGraph ( ) override ;
2019-01-10 04:23:24 +08:00
/** \brief plots the graph to the plotter object specified as parent */
virtual void draw ( JKQTPEnhancedPainter & painter ) override ;
/** \brief plots a key marker inside the specified rectangle \a rect */
virtual void drawKeyMarker ( JKQTPEnhancedPainter & painter , QRectF & rect ) override ;
/** \brief returns the color to be used for the key label */
2019-04-22 19:27:50 +08:00
virtual QColor getKeyLabelColor ( ) const override ;
2019-01-10 04:23:24 +08:00
/** \brief get the maximum and minimum x-value of the graph
*
* This functions returns 0 for both parameters , so that the plotter uses the predefined
* min and max values .
*/
virtual bool getXMinMax ( double & minx , double & maxx , double & smallestGreaterZero ) override ;
/** \brief get the maximum and minimum y-value of the graph
*/
virtual bool getYMinMax ( double & miny , double & maxy , double & smallestGreaterZero ) override ;
/** \brief clear the data sampled from the function. */
void clearData ( ) ;
2019-04-22 19:27:50 +08:00
/*! \brief set color, fill color and error color at the same time */
void setColor ( QColor c ) ;
2019-05-19 04:41:38 +08:00
/*! \copydoc drawLine */
2019-04-22 19:27:50 +08:00
void setDrawLine ( bool __value ) ;
2019-05-19 04:41:38 +08:00
/*! \copydoc drawLine */
2019-04-22 19:27:50 +08:00
bool getDrawLine ( ) const ;
2019-01-10 04:23:24 +08:00
2019-05-30 17:19:56 +08:00
/** \brief sets a functor to be plotted
2019-01-10 04:23:24 +08:00
*
2019-05-30 17:19:56 +08:00
* \ see plotFunction
*/
2019-04-22 19:27:50 +08:00
virtual void setPlotFunctionFunctor ( jkqtpPlotFunctionType & & __value ) ;
2019-05-30 17:19:56 +08:00
/** \brief sets a functor to be plotted
2019-01-10 04:23:24 +08:00
*
2019-05-30 17:19:56 +08:00
* \ see plotFunction
*/
2019-04-22 19:27:50 +08:00
virtual void setPlotFunctionFunctor ( const jkqtpPlotFunctionType & __value ) ;
2019-05-30 17:19:56 +08:00
/** \brief sets a functor to be plotted
2019-01-10 04:23:24 +08:00
*
2019-05-30 17:19:56 +08:00
* \ see simplePlotFunction
*/
2019-04-22 19:27:50 +08:00
virtual void setPlotFunctionFunctor ( jkqtpSimplePlotFunctionType & & __value ) ;
2019-05-30 17:19:56 +08:00
/** \brief sets a functor to be plotted
2019-01-10 04:23:24 +08:00
*
2019-05-30 17:19:56 +08:00
* \ see simplePlotFunction
*/
2019-04-22 19:27:50 +08:00
virtual void setPlotFunctionFunctor ( const jkqtpSimplePlotFunctionType & __value ) ;
2019-05-19 04:41:38 +08:00
/*! \copydoc plotFunction */ \
2019-04-22 19:27:50 +08:00
virtual jkqtpPlotFunctionType getPlotFunctionFunctor ( ) const ;
2019-05-19 04:41:38 +08:00
/*! \copydoc simplePlotFunction */ \
2019-01-26 20:00:40 +08:00
virtual jkqtpSimplePlotFunctionType getSimplePlotFunction ( ) const ;
2019-01-10 04:23:24 +08:00
2019-05-19 04:41:38 +08:00
/*! \copydoc params */
2019-04-22 19:27:50 +08:00
virtual void setParams ( void * __value ) ;
2019-05-19 04:41:38 +08:00
/*! \copydoc params */
2019-04-22 19:27:50 +08:00
void * getParams ( ) const ;
2019-01-10 04:23:24 +08:00
/** \brief sets the params as a pointer to an internal COPY of the given vector (not the data of the vector, as then the size would be unknown!!!) */
2019-04-22 19:27:50 +08:00
virtual void setParams ( const QVector < double > & params ) ;
2019-01-10 04:23:24 +08:00
/** \brief sets the params from a copy of the given array of length \a N */
2019-01-26 20:00:40 +08:00
void setCopiedParams ( const double * params , int N ) ;
2019-01-10 04:23:24 +08:00
/** \brief set an internal parameter vector as function parameters, initialized with {p1} */
2019-01-26 20:00:40 +08:00
void setParamsV ( double p1 ) ;
2019-01-10 04:23:24 +08:00
/** \brief set an internal parameter vector as function parameters, initialized with {p1,p2} */
2019-01-26 20:00:40 +08:00
void setParamsV ( double p1 , double p2 ) ;
2019-01-10 04:23:24 +08:00
/** \brief set an internal parameter vector as function parameters, initialized with {p1,p2,p3} */
2019-01-26 20:00:40 +08:00
void setParamsV ( double p1 , double p2 , double p3 ) ;
2019-01-10 04:23:24 +08:00
/** \brief set an internal parameter vector as function parameters, initialized with {p1,p2,p3,p4} */
2019-01-26 20:00:40 +08:00
void setParamsV ( double p1 , double p2 , double p3 , double p4 ) ;
2019-01-10 04:23:24 +08:00
/** \brief set an internal parameter vector as function parameters, initialized with {p1,p2,p3,p4,p5} */
2019-01-26 20:00:40 +08:00
void setParamsV ( double p1 , double p2 , double p3 , double p4 , double p5 ) ;
2019-01-10 04:23:24 +08:00
/** \brief returns the currently set internal parameter vector */
2019-01-26 20:00:40 +08:00
QVector < double > getInternalParams ( ) const ;
2019-01-10 04:23:24 +08:00
/** \brief returns the currently set internal parameter vector */
2019-01-26 20:00:40 +08:00
QVector < double > getInternalErrorParams ( ) const ;
2019-05-19 04:41:38 +08:00
/*! \copydoc minSamples */
2019-04-22 19:27:50 +08:00
void setMinSamples ( const unsigned int & __value ) ;
2019-05-19 04:41:38 +08:00
/*! \copydoc minSamples */
2019-04-22 19:27:50 +08:00
unsigned int getMinSamples ( ) const ;
2019-05-19 04:41:38 +08:00
/*! \copydoc maxRefinementDegree */
2019-04-22 19:27:50 +08:00
void setMaxRefinementDegree ( const unsigned int & __value ) ;
2019-05-19 04:41:38 +08:00
/*! \copydoc maxRefinementDegree */
2019-04-22 19:27:50 +08:00
unsigned int getMaxRefinementDegree ( ) const ;
2019-05-19 04:41:38 +08:00
/*! \copydoc slopeTolerance */
2019-04-22 19:27:50 +08:00
void setSlopeTolerance ( double __value ) ;
2019-05-19 04:41:38 +08:00
/*! \copydoc slopeTolerance */
2019-04-22 19:27:50 +08:00
double getSlopeTolerance ( ) const ;
2019-05-19 04:41:38 +08:00
/*! \copydoc minPixelPerSample */
2019-04-22 19:27:50 +08:00
void setMinPixelPerSample ( double __value ) ;
2019-05-19 04:41:38 +08:00
/*! \copydoc minPixelPerSample */
2019-04-22 19:27:50 +08:00
double getMinPixelPerSample ( ) const ;
2019-05-19 04:41:38 +08:00
/*! \copydoc plotRefinement */
2019-04-22 19:27:50 +08:00
void setPlotRefinement ( bool __value ) ;
2019-05-19 04:41:38 +08:00
/*! \copydoc plotRefinement */
2019-04-22 19:27:50 +08:00
bool getPlotRefinement ( ) const ;
2019-05-19 04:41:38 +08:00
/*! \copydoc displaySamplePoints */
2019-04-22 19:27:50 +08:00
void setDisplaySamplePoints ( bool __value ) ;
2019-05-19 04:41:38 +08:00
/*! \copydoc displaySamplePoints */
2019-04-22 19:27:50 +08:00
bool getDisplaySamplePoints ( ) const ;
2019-05-19 04:41:38 +08:00
/*! \copydoc drawErrorPolygons */
2019-04-22 19:27:50 +08:00
void setDrawErrorPolygons ( bool __value ) ;
2019-05-19 04:41:38 +08:00
/*! \copydoc drawErrorPolygons */
2019-04-22 19:27:50 +08:00
bool getDrawErrorPolygons ( ) const ;
2019-05-19 04:41:38 +08:00
/*! \copydoc drawErrorLines */
2019-04-22 19:27:50 +08:00
void setDrawErrorLines ( bool __value ) ;
2019-05-19 04:41:38 +08:00
/*! \copydoc drawErrorLines */
2019-04-22 19:27:50 +08:00
bool getDrawErrorLines ( ) const ;
2019-05-30 17:19:56 +08:00
/** \brief sets a functor to be used for calculating errors
2019-01-10 04:23:24 +08:00
*
2019-05-30 17:19:56 +08:00
* \ see errorPlotFunction
*/
2019-01-26 20:00:40 +08:00
virtual void setErrorPlotFunction ( jkqtpPlotFunctionType & & __value ) ;
2019-05-30 17:19:56 +08:00
/** \brief sets a functor to be used for calculating errors
2019-01-10 04:23:24 +08:00
*
2019-05-30 17:19:56 +08:00
* \ see errorPlotFunction
*/
2019-01-26 20:00:40 +08:00
virtual void setErrorPlotFunction ( const jkqtpPlotFunctionType & __value ) ;
2019-05-19 04:41:38 +08:00
/*! \copydoc errorPlotFunction */ \
2019-01-26 20:00:40 +08:00
virtual jkqtpPlotFunctionType getErrorPlotFunction ( ) const ;
2019-05-30 17:19:56 +08:00
/** \brief sets a functor to be used for calculating errors
2019-01-10 04:23:24 +08:00
*
2019-05-30 17:19:56 +08:00
* \ see errorSimplePlotFunction
*/
2019-01-26 20:00:40 +08:00
virtual void setErrorPlotFunction ( jkqtpSimplePlotFunctionType & & __value ) ;
2019-05-30 17:19:56 +08:00
/** \brief sets a functor to be used for calculating errors
2019-01-10 04:23:24 +08:00
*
2019-05-30 17:19:56 +08:00
* \ see errorSimplePlotFunction
*/
2019-01-26 20:00:40 +08:00
virtual void setErrorPlotFunction ( const jkqtpSimplePlotFunctionType & __value ) ;
2019-05-19 04:41:38 +08:00
/*! \copydoc errorSimplePlotFunction */ \
2019-01-26 20:00:40 +08:00
virtual jkqtpSimplePlotFunctionType getErrorSimplePlotFunction ( ) const ;
2019-05-19 04:41:38 +08:00
/*! \copydoc errorParams */
2019-04-22 19:27:50 +08:00
virtual void setErrorParams ( void * __value ) ;
2019-05-19 04:41:38 +08:00
/*! \copydoc errorParams */
2019-04-22 19:27:50 +08:00
void * getErrorParams ( ) const ;
2019-01-10 04:23:24 +08:00
/** \brief sets the error params as a pointer to an internal COPY of the given vector (not the data of the vector, as then the size would be unknown!!!) */
2019-01-26 20:00:40 +08:00
void setErrorParams ( const QVector < double > & errorParams ) ;
2019-01-10 04:23:24 +08:00
2019-05-19 04:41:38 +08:00
/*! \copydoc parameterColumn */
2019-04-22 19:27:50 +08:00
void setParameterColumn ( int __value ) ;
2019-05-19 04:41:38 +08:00
/*! \copydoc parameterColumn */
2019-04-22 19:27:50 +08:00
int getParameterColumn ( ) const ;
2019-05-19 04:41:38 +08:00
/*! \copydoc parameterColumn */
2019-04-22 19:27:50 +08:00
void setParameterColumn ( size_t __value ) ;
2019-05-19 04:41:38 +08:00
/*! \copydoc errorParameterColumn */
2019-04-22 19:27:50 +08:00
void setErrorParameterColumn ( int __value ) ;
2019-05-19 04:41:38 +08:00
/*! \copydoc errorParameterColumn */
2019-04-22 19:27:50 +08:00
int getErrorParameterColumn ( ) const ;
2019-05-19 04:41:38 +08:00
/*! \copydoc errorParameterColumn */
2019-04-22 19:27:50 +08:00
void setErrorParameterColumn ( size_t __value ) ;
2019-01-10 04:23:24 +08:00
- improved: geometric objects now use an adaptive drawing algorithm to represent curves (before e.g. ellipses were always separated into a fixed number of line-segments)
- improved: constructors and access functions for several geometric objects (e.g. more constructors, additional functions to retrieve parameters in diferent forms, iterators for polygons, ...)
- new: all geometric objects can either be drawn as graphic element (i.e. lines are straight line, even on non-linear axes), or as mathematical curve (i.e. on non-linear axes, lines become the appropriate curve representing the linear function, connecting the given start/end-points). The only exceptions are ellipses (and the derived arcs,pies,chords), which are always drawn as mathematical curves
2020-09-04 05:08:52 +08:00
/*! \copydoc errorColor */
virtual void setErrorLineColor ( const QColor & __value ) ;
2019-05-19 04:41:38 +08:00
/*! \copydoc errorColor */
- improved: geometric objects now use an adaptive drawing algorithm to represent curves (before e.g. ellipses were always separated into a fixed number of line-segments)
- improved: constructors and access functions for several geometric objects (e.g. more constructors, additional functions to retrieve parameters in diferent forms, iterators for polygons, ...)
- new: all geometric objects can either be drawn as graphic element (i.e. lines are straight line, even on non-linear axes), or as mathematical curve (i.e. on non-linear axes, lines become the appropriate curve representing the linear function, connecting the given start/end-points). The only exceptions are ellipses (and the derived arcs,pies,chords), which are always drawn as mathematical curves
2020-09-04 05:08:52 +08:00
virtual QColor getErrorLineColor ( ) const ;
2019-05-19 04:41:38 +08:00
/*! \copydoc errorFillColor */
- improved: geometric objects now use an adaptive drawing algorithm to represent curves (before e.g. ellipses were always separated into a fixed number of line-segments)
- improved: constructors and access functions for several geometric objects (e.g. more constructors, additional functions to retrieve parameters in diferent forms, iterators for polygons, ...)
- new: all geometric objects can either be drawn as graphic element (i.e. lines are straight line, even on non-linear axes), or as mathematical curve (i.e. on non-linear axes, lines become the appropriate curve representing the linear function, connecting the given start/end-points). The only exceptions are ellipses (and the derived arcs,pies,chords), which are always drawn as mathematical curves
2020-09-04 05:08:52 +08:00
virtual void setErrorFillColor ( const QColor & __value ) ;
2019-05-19 04:41:38 +08:00
/*! \copydoc errorFillColor */
- improved: geometric objects now use an adaptive drawing algorithm to represent curves (before e.g. ellipses were always separated into a fixed number of line-segments)
- improved: constructors and access functions for several geometric objects (e.g. more constructors, additional functions to retrieve parameters in diferent forms, iterators for polygons, ...)
- new: all geometric objects can either be drawn as graphic element (i.e. lines are straight line, even on non-linear axes), or as mathematical curve (i.e. on non-linear axes, lines become the appropriate curve representing the linear function, connecting the given start/end-points). The only exceptions are ellipses (and the derived arcs,pies,chords), which are always drawn as mathematical curves
2020-09-04 05:08:52 +08:00
virtual QColor getErrorFillColor ( ) const ;
2019-05-19 04:41:38 +08:00
/*! \copydoc errorFillStyle */
- improved: geometric objects now use an adaptive drawing algorithm to represent curves (before e.g. ellipses were always separated into a fixed number of line-segments)
- improved: constructors and access functions for several geometric objects (e.g. more constructors, additional functions to retrieve parameters in diferent forms, iterators for polygons, ...)
- new: all geometric objects can either be drawn as graphic element (i.e. lines are straight line, even on non-linear axes), or as mathematical curve (i.e. on non-linear axes, lines become the appropriate curve representing the linear function, connecting the given start/end-points). The only exceptions are ellipses (and the derived arcs,pies,chords), which are always drawn as mathematical curves
2020-09-04 05:08:52 +08:00
virtual void setErrorFillStyle ( Qt : : BrushStyle __value ) ;
2019-05-19 04:41:38 +08:00
/*! \copydoc errorFillStyle */
- improved: geometric objects now use an adaptive drawing algorithm to represent curves (before e.g. ellipses were always separated into a fixed number of line-segments)
- improved: constructors and access functions for several geometric objects (e.g. more constructors, additional functions to retrieve parameters in diferent forms, iterators for polygons, ...)
- new: all geometric objects can either be drawn as graphic element (i.e. lines are straight line, even on non-linear axes), or as mathematical curve (i.e. on non-linear axes, lines become the appropriate curve representing the linear function, connecting the given start/end-points). The only exceptions are ellipses (and the derived arcs,pies,chords), which are always drawn as mathematical curves
2020-09-04 05:08:52 +08:00
virtual Qt : : BrushStyle getErrorFillStyle ( ) const ;
2019-05-19 04:41:38 +08:00
/*! \copydoc errorStyle */
- improved: geometric objects now use an adaptive drawing algorithm to represent curves (before e.g. ellipses were always separated into a fixed number of line-segments)
- improved: constructors and access functions for several geometric objects (e.g. more constructors, additional functions to retrieve parameters in diferent forms, iterators for polygons, ...)
- new: all geometric objects can either be drawn as graphic element (i.e. lines are straight line, even on non-linear axes), or as mathematical curve (i.e. on non-linear axes, lines become the appropriate curve representing the linear function, connecting the given start/end-points). The only exceptions are ellipses (and the derived arcs,pies,chords), which are always drawn as mathematical curves
2020-09-04 05:08:52 +08:00
virtual void setErrorLineStyle ( Qt : : PenStyle __value ) ;
2019-05-19 04:41:38 +08:00
/*! \copydoc errorStyle */
- improved: geometric objects now use an adaptive drawing algorithm to represent curves (before e.g. ellipses were always separated into a fixed number of line-segments)
- improved: constructors and access functions for several geometric objects (e.g. more constructors, additional functions to retrieve parameters in diferent forms, iterators for polygons, ...)
- new: all geometric objects can either be drawn as graphic element (i.e. lines are straight line, even on non-linear axes), or as mathematical curve (i.e. on non-linear axes, lines become the appropriate curve representing the linear function, connecting the given start/end-points). The only exceptions are ellipses (and the derived arcs,pies,chords), which are always drawn as mathematical curves
2020-09-04 05:08:52 +08:00
virtual Qt : : PenStyle getErrorLineStyle ( ) const ;
2019-05-19 04:41:38 +08:00
/*! \copydoc errorLineWidth */
- improved: geometric objects now use an adaptive drawing algorithm to represent curves (before e.g. ellipses were always separated into a fixed number of line-segments)
- improved: constructors and access functions for several geometric objects (e.g. more constructors, additional functions to retrieve parameters in diferent forms, iterators for polygons, ...)
- new: all geometric objects can either be drawn as graphic element (i.e. lines are straight line, even on non-linear axes), or as mathematical curve (i.e. on non-linear axes, lines become the appropriate curve representing the linear function, connecting the given start/end-points). The only exceptions are ellipses (and the derived arcs,pies,chords), which are always drawn as mathematical curves
2020-09-04 05:08:52 +08:00
virtual void setErrorLineWidth ( double __value ) ;
2019-05-19 04:41:38 +08:00
/*! \copydoc errorLineWidth */
- improved: geometric objects now use an adaptive drawing algorithm to represent curves (before e.g. ellipses were always separated into a fixed number of line-segments)
- improved: constructors and access functions for several geometric objects (e.g. more constructors, additional functions to retrieve parameters in diferent forms, iterators for polygons, ...)
- new: all geometric objects can either be drawn as graphic element (i.e. lines are straight line, even on non-linear axes), or as mathematical curve (i.e. on non-linear axes, lines become the appropriate curve representing the linear function, connecting the given start/end-points). The only exceptions are ellipses (and the derived arcs,pies,chords), which are always drawn as mathematical curves
2020-09-04 05:08:52 +08:00
virtual double getErrorLineWidth ( ) const ;
2019-01-10 04:23:24 +08:00
2019-01-20 17:49:29 +08:00
/** \copydoc JKQTPGraph::usesColumn() */
2019-01-10 04:23:24 +08:00
virtual bool usesColumn ( int c ) const override ;
/** \brief sets function to the given special function */
void setSpecialFunction ( SpecialFunction function ) ;
/** \brief returns, which special function is set (or if any is set) */
SpecialFunction getFunctionType ( ) const ;
protected :
2019-04-22 19:27:50 +08:00
2019-01-10 04:23:24 +08:00
struct doublePair {
double x ;
double f ;
doublePair * next ;
} ;
/** \brief a linked list holding the datapoints \f$ \left(x, y=f(x, \vec{p})\right) \f$ to be plotted */
doublePair * data ;
/** \brief fill the data array with data from the function plotFunction */
virtual void createPlotData ( bool collectParams = true ) ;
virtual void collectParameters ( ) ;
/** \brief refine datapoints on the function graph between two evaluations \a a and \a b */
void refine ( doublePair * a , doublePair * b , unsigned int degree = 0 ) ;
/** \brief if set, the values from this datatsore column are used for the parameters \c p1 , \c p2 , \c p3 , ... of the plot function */
int parameterColumn ;
/** \brief if set, the values from this datatsore column are used for the parameters \c p1 , \c p2 , \c p3 , ... of the error plot function */
int errorParameterColumn ;
/** \brief indicates whether to draw a line or not */
bool drawLine ;
/** \brief indicates whether to fill the space between the curve and the x-axis */
bool fillCurve ;
/** \brief the function to be plotted */
jkqtpPlotFunctionType plotFunction ;
/** \brief a simple function to be plotted, simplified form without parameters */
jkqtpSimplePlotFunctionType simplePlotFunction ;
/** \brief indicates whether a special function is set (and if so, which one), or a user-supplied function */
SpecialFunction functionType ;
/** \brief pointer to the parameters supplied to the plotting funtion */
void * params ;
/** \brief the minimum number of points to evaluate the function at */
unsigned int minSamples ;
/** \brief the maximum number of recursive refinement steps
*
* each step bisects the interval \ f $ [ a , b ] \ f $ into two halfes . So the maximum number
* of points plotted at all are thus :
* \ f [ \ mbox { minSamples } \ cdot 2 ^ { \ mbox { maxRefinementDegree } } \ f ]
*/
unsigned int maxRefinementDegree ;
/** \brief the tolerance for the difference of two subsequent slopes */
double slopeTolerance ;
/** \brief create one sample at least every \a minPixelPerSample pixels */
double minPixelPerSample ;
/** \brief switch on or off [default: on] the plot refinement algorithm */
bool plotRefinement ;
/** \brief if true [default: off] display the points where the function has been sampled */
bool displaySamplePoints ;
/** \brief indicates whether an error polygon should be drawn */
bool drawErrorPolygons ;
/** \brief indicates whether error lines should be drawn */
bool drawErrorLines ;
/** \brief this function calculates the error at a given position */
jkqtpPlotFunctionType errorPlotFunction ;
/** \brief this function calculates the error at a given position, simplified form without parameters */
jkqtpSimplePlotFunctionType errorSimplePlotFunction ;
/** \brief parameters for errorFunction */
void * errorParams ;
2019-04-22 19:27:50 +08:00
2019-01-10 04:23:24 +08:00
/** \brief color of the error graph */
QColor errorColor ;
/** \brief color of the error graph fill */
QColor errorFillColor ;
/** \brief linestyle of the error graph lines */
Qt : : PenStyle errorStyle ;
/** \brief width (pixels) of the error graph */
double errorLineWidth ;
/** \brief fill style, if the error curve should be filled */
Qt : : BrushStyle errorFillStyle ;
QBrush getErrorBrush ( JKQTPEnhancedPainter & painter ) const ;
QPen getErrorLinePen ( JKQTPEnhancedPainter & painter ) const ;
QVector < double > iparams , ierrorparams ;
} ;
/*! \brief This implements line plots where the data is taken from a user supplied function \f$ x=f(y) \f$
2019-01-19 16:40:52 +08:00
\ ingroup jkqtplotter_functiongraphs
2019-01-10 04:23:24 +08:00
2019-06-13 16:27:06 +08:00
\ see \ ref JKQTPlotterFunctionPlots
2019-01-10 04:23:24 +08:00
*/
2019-06-22 20:21:32 +08:00
class JKQTPLOTTER_LIB_EXPORT JKQTPYFunctionLineGraph : public JKQTPXFunctionLineGraph {
2019-01-10 04:23:24 +08:00
Q_OBJECT
public :
/** \brief class constructor */
2019-01-20 17:49:29 +08:00
JKQTPYFunctionLineGraph ( JKQTBasePlotter * parent = nullptr ) ;
2019-01-10 04:23:24 +08:00
/** \brief class constructor */
2019-01-20 23:15:10 +08:00
JKQTPYFunctionLineGraph ( JKQTPlotter * parent ) ;
2019-05-30 04:40:02 +08:00
/** \brief class constructor */
JKQTPYFunctionLineGraph ( const jkqtpSimplePlotFunctionType & f , const QString & title , JKQTBasePlotter * parent = nullptr ) ;
/** \brief class constructor */
JKQTPYFunctionLineGraph ( const jkqtpSimplePlotFunctionType & f , const QString & title , JKQTPlotter * parent ) ;
/** \brief class constructor */
JKQTPYFunctionLineGraph ( jkqtpSimplePlotFunctionType & & f , const QString & title , JKQTBasePlotter * parent = nullptr ) ;
/** \brief class constructor */
JKQTPYFunctionLineGraph ( jkqtpSimplePlotFunctionType & & f , const QString & title , JKQTPlotter * parent ) ;
2019-01-10 04:23:24 +08:00
/** \brief plots the graph to the plotter object specified as parent */
virtual void draw ( JKQTPEnhancedPainter & painter ) override ;
protected :
/** \brief fill the data array with data from the function plotFunction */
virtual void createPlotData ( bool collectParams = true ) override ;
} ;
# endif // jkqtpgraphsevaluatedfunction_H