From f77bc97ca542e3a0b4ab1d7b2d19eba83d5534ab Mon Sep 17 00:00:00 2001 From: jkriege2 Date: Mon, 7 Sep 2020 20:57:25 +0200 Subject: [PATCH] - cleanup of class-hierarchy of evaluated functions - added slots for several properties of evaluated functions - updated examples --- doc/dox/whatsnew.dox | 1 + examples/evalcurve/README.md | 56 +- examples/evalcurve/evalcurve.cpp | 34 +- examples/functionplot/README.md | 3 + lib/jkqtcommon/jkqtpmathtools.h | 14 +- .../graphs/jkqtpevaluatedfunction.cpp | 790 +++++++++--------- .../graphs/jkqtpevaluatedfunction.h | 334 ++++---- .../graphs/jkqtpevaluatedfunctionbase.cpp | 207 ++++- .../graphs/jkqtpevaluatedfunctionbase.h | 188 ++++- .../graphs/jkqtpevaluatedparametriccurve.cpp | 255 +++--- .../graphs/jkqtpevaluatedparametriccurve.h | 216 +++-- .../graphs/jkqtpparsedfunction.cpp | 390 ++++----- lib/jkqtplotter/graphs/jkqtpparsedfunction.h | 161 ++-- screenshots/evalcurve.png | Bin 54127 -> 130266 bytes screenshots/evalcurve_small.png | Bin 21858 -> 23017 bytes 15 files changed, 1552 insertions(+), 1097 deletions(-) diff --git a/doc/dox/whatsnew.dox b/doc/dox/whatsnew.dox index 5b55d92c04..eeb0b137b5 100644 --- a/doc/dox/whatsnew.dox +++ b/doc/dox/whatsnew.dox @@ -23,6 +23,7 @@ Changes, compared to \ref page_whatsnew_V2019_11 "v2019.11" include:
  • removed the usage of some deprecated functions and objects (e.g. QMatrix)
  • 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, ...)
  • +
  • improved: reworked class hirarchy of parsed function plots and declared several setters as slots.
  • new: added geometric plot objects JKQTPGeoArrow to draw arrows (aka lines with added line-end decorators, also extended JKQTPGeoLine, JKQTPGeoInfiniteLine, JKQTPGeoPolyLines to draw line-end decorator (aka arrows)
  • 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
  • new: a new graph class JKQTPXYFunctionLineGraph draws parametric 2D curves ( \f$ [x,y] = f(t) \f$ ), see \ref JKQTPlotterEvalCurves for an example
  • diff --git a/examples/evalcurve/README.md b/examples/evalcurve/README.md index a0ac644885..5106946a14 100644 --- a/examples/evalcurve/README.md +++ b/examples/evalcurve/README.md @@ -1,6 +1,8 @@ # Example (JKQTPlotter): Plotting Parametric Mathematical Curves as Line Graphs {#JKQTPlotterEvalCurves} ## Basics -This project (see `./examples/evalcurve/`) demonstrates how to plot mathematical functions as line graphs. The functions may be defined as static C functions, C++ functors or c++ inline functions. +This project (see `./examples/evalcurve/`) demonstrates how to plot mathematical functions as line graphs. The functions may be defined as static C functions, C++ functors or c++ inline functions. The functions may simply depend on the parameter `t`, or on `t` and a vector of parameters. + +The class uses an adaptive algorithm, which determines by the local slope, at how many points (or how close points) the functor has to be evaluated. [TOC] @@ -9,24 +11,55 @@ The example shows how to plot a simple C++ inline function: ```.cpp JKQTPXYFunctionLineGraph* func1=new JKQTPXYFunctionLineGraph(plot); - func1->setPlotFunctionFunctor([](double t) -> QPointF { - const double a=5; - const double b=4; - const double delta=JKQTPSTATISTICS_PI/4.0; - return QPointF(sin(a*t+delta), sin(b*t)); + func1->setPlotFunctionFunctor([](double t) ->QPointF { + return QPointF( + sin(t)*(exp(cos(t))-2.0*cos(4.0*t)-jkqtp_pow5(sin(t/12.0))), + cos(t)*(exp(cos(t))-2.0*cos(4.0*t)-jkqtp_pow5(sin(t/12.0))) + ); }); - func1->setTRange(0, 2.0*JKQTPSTATISTICS_PI); - func1->setTitle("C++-inline function $[ sin(5{\\cdot}t+\\pi/4), sin(4{\\cdot}t) ]$"); + func1->setTRange(0, 12.0*JKQTPSTATISTICS_PI); + func1->setTitle("C++-inline function: \"Butterfly Curve\""); plot->addGraph(func1); ``` -Note that here a functor is defined, which calculates the points on a [Lissajous Curve](https://en.wikipedia.org/wiki/Lissajous_curve), i.e. a function mapping a parameter `t` to a two-dimensional point `QPointF` with `x=sin(a*t+delta)`and `y=sin(b*t)`. This function is evaluated on a range of values for `t`, set by +Note that here a functor is defined, which calculates the points on a [Butterfly Curve](https://en.wikipedia.org/wiki/Butterfly_curve_(transcendental)), i.e. a function mapping a parameter `t` to a two-dimensional point `QPointF` with complex functions for x and y. This function is evaluated on a range of values for `t`, set by ```.cpp func1->setTRange(0, 2.0*JKQTPSTATISTICS_PI); ``` -The class uses an adaptive algorithm, which determines by the local slope, at how many points (or how close points) the functor has to be evaluated. +# Simple C++ inline function with Parameters +`JKQTPXYFunctionLineGraph` allows to use more complex functors alternatively: These depend on the variable `t`and a vector of parameters. Here is an example: + +```.cpp + func2->setPlotFunctionFunctor([](double t, const QVector& params) ->QPointF { + return QPointF( + 3.0*sin(params[0]*t+params[2])+8.0, + 3.0*sin(params[1]*t) + ); + }); + // now we define the 3 parameters of the function + func2->setParamsV(5, 4, JKQTPSTATISTICS_PI/4.0); + // and define the range over which to evaluate + func2->setTRange(0, 2.0*JKQTPSTATISTICS_PI); + func1->setTitle("C++-inline function $[ sin(5{\\cdot}t+\\pi/4), sin(4{\\cdot}t) ]$"); + plot->addGraph(func1); +``` + +In the functor we can use the entries in the vector `param` as function parameters. The values in this vector are defined by + +```.cpp + // now we define the 3 parameters of the function + func2->setParamsV(5, 4, JKQTPSTATISTICS_PI/4.0); +``` + +Alternatively they can also be taken from a column in the internal datastore. Then you have to call: + +```.cpp + func2->setParameterColumn(ColumnID); +``` + +instead, where `ColumnID` is the ID of the column with the parameter values. # Screenshot @@ -36,7 +69,6 @@ This code snippets above result in a plot like this: # Notes -Just as shown in [examples/functionplot](https://github.com/jkriege2/JKQtPlotter/tree/master/examples/functionplot) for JKQTPXFunctionLineGraph and JKQTPYFunctionLineGraph, different types of functions can be used to plot. Either simple C++ inline functions, that take a `double t` and return a `QPointF`, or functions that additionally take a parameter vector `void* params`. In that case, the parameters may be provided from different sources, as described in [examples/functionplot](https://github.com/jkriege2/JKQtPlotter/tree/master/examples/functionplot) . - +This example describes how to draw 2D parametric curves. For (simpler) 1D-functions f(x) or f(y), see [examples/functionplot](https://github.com/jkriege2/JKQtPlotter/tree/master/examples/functionplot) . diff --git a/examples/evalcurve/evalcurve.cpp b/examples/evalcurve/evalcurve.cpp index 11c82eed45..c22db16202 100644 --- a/examples/evalcurve/evalcurve.cpp +++ b/examples/evalcurve/evalcurve.cpp @@ -27,14 +27,34 @@ int main(int argc, char* argv[]) // the function is defined as C++ inline function JKQTPXYFunctionLineGraph* func1=new JKQTPXYFunctionLineGraph(plot); func1->setPlotFunctionFunctor([](double t) ->QPointF { - const double a=5; - const double b=4; - const double delta=JKQTPSTATISTICS_PI/4.0; - return QPointF(sin(a*t+delta), sin(b*t)); + return QPointF( + sin(t)*(exp(cos(t))-2.0*cos(4.0*t)-jkqtp_pow5(sin(t/12.0))), + cos(t)*(exp(cos(t))-2.0*cos(4.0*t)-jkqtp_pow5(sin(t/12.0))) + ); }); - func1->setTRange(0, 2.0*JKQTPSTATISTICS_PI); - func1->setTitle("C++-inline function $[ sin(5{\\cdot}t+\\pi/4), sin(4{\\cdot}t) ]$"); + func1->setTRange(0, 12.0*JKQTPSTATISTICS_PI); + func1->setTitle("C++-inline function: \"Butterfly Curve\""); plot->addGraph(func1); + + + + // 3. a second JKQTPXYFunctionLineGraph object shows how to use functions that + // also take a parameter vector, in addition to the dependent variable t + JKQTPXYFunctionLineGraph* func2=new JKQTPXYFunctionLineGraph(plot); + func2->setPlotFunctionFunctor([](double t, const QVector& params) ->QPointF { + return QPointF( + 3.0*sin(params[0]*t+params[2])+8.0, + 3.0*sin(params[1]*t) + ); + }); + // now we define the 3 parameters of the function + func2->setParamsV(5, 4, JKQTPSTATISTICS_PI/4.0); + // and define the range over which to evaluate + func2->setTRange(0, 2.0*JKQTPSTATISTICS_PI); + func2->setTitle("C++-inline function $[ sin(5{\\cdot}t+\\pi/4), sin(4{\\cdot}t) ]$"); + plot->addGraph(func2); + + // 8. set some axis properties (we use LaTeX for nice equation rendering) plot->getXAxis()->setAxisLabel(QObject::tr("x-axis")); plot->getYAxis()->setAxisLabel(QObject::tr("y-axis")); @@ -42,7 +62,7 @@ int main(int argc, char* argv[]) // 4. scale the plot so the graph is contained - plot->setXY(-1.1,1.1,-1.1,1.1); + plot->setXY(-3,12,-3.2,3.2); // show window and make it a decent size mainWin.show(); diff --git a/examples/functionplot/README.md b/examples/functionplot/README.md index e854a10b58..bd4367ce52 100644 --- a/examples/functionplot/README.md +++ b/examples/functionplot/README.md @@ -108,3 +108,6 @@ All examples above use the graph class `JKQTPXFunctionLineGraph`, which plots a ![functionplot_fy](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/functionplot_fy.png) +This example describes how to draw 1D functions. For an example of how to draw 2D parametric curves `[x,y]=f(t)`, see [examples/evalcurve](https://github.com/jkriege2/JKQtPlotter/tree/master/examples/evalcurve) . + + diff --git a/lib/jkqtcommon/jkqtpmathtools.h b/lib/jkqtcommon/jkqtpmathtools.h index b8cd839d32..36d544165b 100644 --- a/lib/jkqtcommon/jkqtpmathtools.h +++ b/lib/jkqtcommon/jkqtpmathtools.h @@ -290,12 +290,22 @@ inline T jkqtp_sqr(const T& v) { \ingroup jkqtptools_math_basic */ -template -inline T jkqtp_pow4(T x) { + template + inline T jkqtp_pow4(T x) { const T xx=x*x; return xx*xx; } +/*! \brief 5-th power of a number + \ingroup jkqtptools_math_basic + +*/ +template +inline T jkqtp_pow5(T x) { + const T xx=x*x; + return xx*xx*x; +} + /*! \brief cube of a number \ingroup jkqtptools_math_basic diff --git a/lib/jkqtplotter/graphs/jkqtpevaluatedfunction.cpp b/lib/jkqtplotter/graphs/jkqtpevaluatedfunction.cpp index 4f25373fee..e676f6f8e0 100644 --- a/lib/jkqtplotter/graphs/jkqtpevaluatedfunction.cpp +++ b/lib/jkqtplotter/graphs/jkqtpevaluatedfunction.cpp @@ -31,29 +31,22 @@ - - -JKQTPXFunctionLineGraph::JKQTPXFunctionLineGraph(JKQTBasePlotter* parent): - JKQTPEvaluatedFunctionWithParamsGraphBase(parent) +JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase::JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase(JKQTBasePlotter* parent): + JKQTPEvaluatedFunctionWithErrorsGraphBase(parent), + drawLine(true), + fillCurve(false), + drawErrorPolygons(false), + drawErrorLines(false) { - functionType=SpecialFunction::UserFunction; - drawLine=true; - fillCurve=false; - initLineStyle(parent, parentPlotStyle); initFillStyle(parent, parentPlotStyle); - drawErrorPolygons=false; - drawErrorLines=false; - errorParams=nullptr; errorColor=getLineColor().lighter(); errorFillColor=getLineColor().lighter(); errorStyle=Qt::SolidLine; errorLineWidth=1; errorFillStyle=Qt::SolidPattern; - errorParameterColumn=-1; - if (parent && parentPlotStyle>=0) { // get style settings from parent object //std::cout<<"got style settings from parent: "<getPlotter()) +JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase::JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase(JKQTPlotter* parent): + JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase(parent->getPlotter()) { } -JKQTPXFunctionLineGraph::JKQTPXFunctionLineGraph(const jkqtpSimplePlotFunctionType &f, const QString &title_, JKQTBasePlotter *parent): - JKQTPXFunctionLineGraph(parent) -{ - title=title_; - plotFunction=jkqtpPlotFunctionType(); - simplePlotFunction=f; - functionType=SpecialFunction::UserFunction; - data.clear(); -} - -JKQTPXFunctionLineGraph::JKQTPXFunctionLineGraph(const jkqtpSimplePlotFunctionType &f, const QString &title_, JKQTPlotter *parent): - JKQTPXFunctionLineGraph(f, title_, parent->getPlotter()) -{ -} - -JKQTPXFunctionLineGraph::JKQTPXFunctionLineGraph(jkqtpSimplePlotFunctionType &&f, const QString &title_, JKQTBasePlotter *parent): - JKQTPXFunctionLineGraph(parent) -{ - title=title_; - plotFunction=jkqtpPlotFunctionType(); - simplePlotFunction=std::move(f); - functionType=SpecialFunction::UserFunction; - data.clear(); -} - -JKQTPXFunctionLineGraph::JKQTPXFunctionLineGraph(jkqtpSimplePlotFunctionType &&f, const QString &title_, JKQTPlotter *parent): - JKQTPXFunctionLineGraph(std::move(f), title_, parent->getPlotter()) -{ - -} - -JKQTPXFunctionLineGraph::JKQTPXFunctionLineGraph(JKQTPXFunctionLineGraph::SpecialFunction type, const QVector ¶ms, const QString &title_, JKQTBasePlotter *parent): - JKQTPXFunctionLineGraph(parent) -{ - title=title_; - functionType=type; - setParams(params); - data.clear(); -} - -JKQTPXFunctionLineGraph::JKQTPXFunctionLineGraph(JKQTPXFunctionLineGraph::SpecialFunction type, const QVector ¶ms, const QString &title, JKQTPlotter *parent): - JKQTPXFunctionLineGraph(type, params, title, parent->getPlotter()) +JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase::~JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase() { } -JKQTPXFunctionLineGraph::~JKQTPXFunctionLineGraph() { - data.clear(); -} - - -void JKQTPXFunctionLineGraph::setDrawLine(bool __value) +void JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase::setDrawLine(bool __value) { this->drawLine = __value; } -bool JKQTPXFunctionLineGraph::getDrawLine() const +bool JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase::getDrawLine() const { return this->drawLine; } -void JKQTPXFunctionLineGraph::setPlotFunctionFunctor(const jkqtpPlotFunctionType &__value) -{ - simplePlotFunction=jkqtpSimplePlotFunctionType(); - plotFunction = __value; - functionType=SpecialFunction::UserFunction; - - data.clear(); -} - -void JKQTPXFunctionLineGraph::setPlotFunctionFunctor(const jkqtpSimplePlotFunctionType &__value) -{ - plotFunction=jkqtpPlotFunctionType(); - simplePlotFunction=__value; - functionType=SpecialFunction::UserFunction; - - data.clear(); -} - -void JKQTPXFunctionLineGraph::setPlotFunctionFunctor(jkqtpPlotFunctionType &&__value) -{ - simplePlotFunction=jkqtpSimplePlotFunctionType(); - plotFunction = std::move(__value); - functionType=SpecialFunction::UserFunction; - data.clear(); -} - -void JKQTPXFunctionLineGraph::setPlotFunctionFunctor(jkqtpSimplePlotFunctionType &&__value) -{ - plotFunction=jkqtpPlotFunctionType(); - simplePlotFunction=std::move(__value); - functionType=SpecialFunction::UserFunction; - - data.clear(); -} - -jkqtpPlotFunctionType JKQTPXFunctionLineGraph::getPlotFunctionFunctor() const -{ - return plotFunction; -} - -jkqtpSimplePlotFunctionType JKQTPXFunctionLineGraph::getSimplePlotFunction() const -{ - return simplePlotFunction; -} - -void JKQTPXFunctionLineGraph::drawKeyMarker(JKQTPEnhancedPainter& painter, QRectF& rect) { +void JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase::drawKeyMarker(JKQTPEnhancedPainter& painter, QRectF& rect) { painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); QPen p=getLinePen(painter, parent); p.setJoinStyle(Qt::RoundJoin); @@ -195,73 +97,110 @@ void JKQTPXFunctionLineGraph::drawKeyMarker(JKQTPEnhancedPainter& painter, QRect } -QColor JKQTPXFunctionLineGraph::getKeyLabelColor() const { +QColor JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase::getKeyLabelColor() const { return getLineColor(); } -bool JKQTPXFunctionLineGraph::getXMinMax(double &minx, double &maxx, double &smallestGreaterZero) -{ - smallestGreaterZero=minx=maxx=0; return false; + +QBrush JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase::getErrorBrush(JKQTPEnhancedPainter& /*painter*/) const { + QBrush b; + b.setColor(errorFillColor); + b.setStyle(errorFillStyle); + return b; } -bool JKQTPXFunctionLineGraph::getYMinMax(double &miny, double &maxy, double &smallestGreaterZero) -{ - smallestGreaterZero=miny=maxy=0; return false; +QPen JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase::getErrorLinePen(JKQTPEnhancedPainter& painter) const { + QPen p; + p.setColor(errorColor); + p.setWidthF(qMax(JKQTPlotterDrawingTools::ABS_MIN_LINEWIDTH,parent->pt2px(painter, parent->getLineWidthMultiplier()*errorLineWidth))); + p.setStyle(errorStyle); + p.setJoinStyle(Qt::RoundJoin); + p.setCapStyle(Qt::RoundCap); + + return p; } -void JKQTPXFunctionLineGraph::createPlotData(bool collectParams) { + +void JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase::setErrorLineColor(const QColor &__value) +{ + this->errorColor = __value; +} + +QColor JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase::getErrorLineColor() const +{ + return this->errorColor; +} + +void JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase::setErrorFillColor(const QColor &__value) +{ + this->errorFillColor = __value; +} + +QColor JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase::getErrorFillColor() const +{ + return this->errorFillColor; +} + +void JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase::setErrorFillStyle(Qt::BrushStyle __value) +{ + this->errorFillStyle = __value; +} + +Qt::BrushStyle JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase::getErrorFillStyle() const +{ + return this->errorFillStyle; +} + +void JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase::setErrorLineStyle(Qt::PenStyle __value) +{ + this->errorStyle = __value; +} + +Qt::PenStyle JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase::getErrorLineStyle() const +{ + return this->errorStyle; +} + +void JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase::setErrorLineWidth(double __value) +{ + this->errorLineWidth = __value; +} + +double JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase::getErrorLineWidth() const +{ + return this->errorLineWidth; +} + +void JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase::setColor(QColor c) +{ + setLineColor(c); + c.setAlphaF(0.5); + setHighlightingLineColor(c); +} + +void JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase::setDrawErrorPolygons(bool __value) +{ + this->drawErrorPolygons = __value; +} + +bool JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase::getDrawErrorPolygons() const +{ + return this->drawErrorPolygons; +} + +void JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase::setDrawErrorLines(bool __value) +{ + this->drawErrorLines = __value; +} + +bool JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase::getDrawErrorLines() const +{ + return this->drawErrorLines; +} + +void JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase::drawXGraph(JKQTPEnhancedPainter& painter) { #ifdef JKQTBP_AUTOTIMER - JKQTPAutoOutputTimer jkaat(QString("JKQTPXFunctionLineGraph[%1]::createPlotData()").arg(title)); -#endif - data.clear(); - if (collectParams) collectParameters(); - - if (parent==nullptr) return; - if (!plotFunction && !simplePlotFunction) return; - - jkqtpSimplePlotFunctionType func; - if (plotFunction) func=std::bind(plotFunction, std::placeholders::_1, getInternalParams()); - else if (simplePlotFunction) func=simplePlotFunction; - - const double xmin=parent->getXMin(); - const double xmax=parent->getXMax(); - - std::function fTransformedFunc= std::bind([&](const JKQTPPlotElement* plot, double x) -> QPointF { return plot->transform(x, func(x)); }, this, std::placeholders::_1); - - JKQTPAdaptiveFunctionGraphEvaluator evaluator(fTransformedFunc, minSamples, maxRefinementDegree, slopeTolerance, minPixelPerSample); - data=evaluator.evaluate(xmin, xmax); - data=JKQTPSimplyfyLineSegemnts(data, dataCleanupMaxAllowedAngleDegree); -} - -void JKQTPXFunctionLineGraph::collectParameters() -{ - JKQTPEvaluatedFunctionWithParamsGraphBase::collectParameters(); - - if (parent && errorParameterColumn>=0) { - ierrorparams.clear(); - JKQTPDatastore* datastore=parent->getDatastore(); - int imin=0; - int imax= static_cast(datastore->getRows(errorParameterColumn)); - - for (int i=imin; iget(errorParameterColumn,i); - ierrorparams<=0 && !JKQTPIsOKFloat(ierrorparams[i])) { - ierrorparams.remove(i,1); - i--; - } - - errorParams=&ierrorparams; - } -} - - - -void JKQTPXFunctionLineGraph::draw(JKQTPEnhancedPainter& painter) { -#ifdef JKQTBP_AUTOTIMER - JKQTPAutoOutputTimer jkaaot("JKQTPXFunctionLineGraph::draw"); + JKQTPAutoOutputTimer jkaaot("JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase::drawXGraph"); #endif if (parent==nullptr) return; JKQTPDatastore* datastore=parent->getDatastore(); @@ -271,6 +210,8 @@ void JKQTPXFunctionLineGraph::draw(JKQTPEnhancedPainter& painter) { createPlotData(); //qDebug()<<"plot data created\n"; + auto errorPlotFunction=buildErrorFunctorSpec(); + drawErrorsBefore(painter); { painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); @@ -308,11 +249,11 @@ void JKQTPXFunctionLineGraph::draw(JKQTPEnhancedPainter& painter) { //std::cout<<"(xv, yv) = ( "<(errorPlotFunction))) { - double e=errorPlotFunction(xv, getInternalErrorParams()); + const double e=errorPlotFunction(xv).y(); ype=transformY(yv+e); yme=transformY(yv-e); ype=qBound(yami, ype, yama); @@ -384,73 +325,9 @@ void JKQTPXFunctionLineGraph::draw(JKQTPEnhancedPainter& painter) { //std::cout<<"plot done\n"; } - - - - - - - - - - - - - - -JKQTPYFunctionLineGraph::JKQTPYFunctionLineGraph(JKQTBasePlotter *parent): - JKQTPXFunctionLineGraph(parent) -{ - -} - -JKQTPYFunctionLineGraph::JKQTPYFunctionLineGraph(JKQTPlotter *parent): - JKQTPYFunctionLineGraph(parent->getPlotter()) -{ - -} - -JKQTPYFunctionLineGraph::JKQTPYFunctionLineGraph(const jkqtpSimplePlotFunctionType &f, const QString &title, JKQTBasePlotter *parent): - JKQTPXFunctionLineGraph(f, title, parent) -{ - -} - -JKQTPYFunctionLineGraph::JKQTPYFunctionLineGraph(const jkqtpSimplePlotFunctionType &f, const QString &title, JKQTPlotter *parent): - JKQTPXFunctionLineGraph(f, title, parent) -{ - -} - - -JKQTPYFunctionLineGraph::JKQTPYFunctionLineGraph(jkqtpSimplePlotFunctionType &&f, const QString &title, JKQTBasePlotter *parent): - JKQTPXFunctionLineGraph(std::move(f), title, parent) -{ - -} - - -JKQTPYFunctionLineGraph::JKQTPYFunctionLineGraph(jkqtpSimplePlotFunctionType &&f, const QString &title, JKQTPlotter *parent): - JKQTPXFunctionLineGraph(std::move(f), title, parent) -{ - -} - - -JKQTPYFunctionLineGraph::JKQTPYFunctionLineGraph(JKQTPYFunctionLineGraph::SpecialFunction type, const QVector ¶ms, const QString &title_, JKQTBasePlotter *parent): - JKQTPXFunctionLineGraph(type, params, title_, parent) -{ -} - -JKQTPYFunctionLineGraph::JKQTPYFunctionLineGraph(JKQTPYFunctionLineGraph::SpecialFunction type, const QVector ¶ms, const QString &title_, JKQTPlotter *parent): - JKQTPXFunctionLineGraph(type, params, title_, parent->getPlotter()) -{ - -} - -void JKQTPYFunctionLineGraph::draw(JKQTPEnhancedPainter& painter) { +void JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase::drawYGraph(JKQTPEnhancedPainter& painter) { #ifdef JKQTBP_AUTOTIMER - JKQTPAutoOutputTimer jkaaot("JKQTPYFunctionLineGraph::draw"); + JKQTPAutoOutputTimer jkaaot("JKQTPYFunctionLineGraph::drawYGraph"); #endif if (parent==nullptr) return; JKQTPDatastore* datastore=parent->getDatastore(); @@ -460,6 +337,8 @@ void JKQTPYFunctionLineGraph::draw(JKQTPEnhancedPainter& painter) { createPlotData(); //std::cout<<"plot data created\n"; + auto errorPlotFunction=buildErrorFunctorSpec(); + drawErrorsBefore(painter); { painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); @@ -497,11 +376,11 @@ void JKQTPYFunctionLineGraph::draw(JKQTPEnhancedPainter& painter) { //std::cout<<"(xv, yv) = ( "<(errorPlotFunction))) { - double e=errorPlotFunction(yv, getInternalErrorParams()); + const double e=errorPlotFunction(yv).x(); xpe=transformX(xv+e); xme=transformX(xv-e); xpe=qBound(xami, xpe, xama); @@ -573,124 +452,80 @@ void JKQTPYFunctionLineGraph::draw(JKQTPEnhancedPainter& painter) { } -void JKQTPYFunctionLineGraph::createPlotData(bool collectParams) { + + + + + + + + + + +JKQTPFunctorLineGraphBase::JKQTPFunctorLineGraphBase(JKQTBasePlotter* parent): + JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase(parent) +{ + +} + +JKQTPFunctorLineGraphBase::JKQTPFunctorLineGraphBase(JKQTPlotter* parent): + JKQTPFunctorLineGraphBase(parent->getPlotter()) +{ + +} + +JKQTPFunctorLineGraphBase::JKQTPFunctorLineGraphBase(const jkqtpSimplePlotFunctionType &f, const QString &title_, JKQTBasePlotter *parent): + JKQTPFunctorLineGraphBase(parent) +{ + title=title_; + plotFunction=jkqtpPlotFunctionType(); + simplePlotFunction=f; data.clear(); - if (collectParams) collectParameters(); - - if (parent==nullptr) return; - if (!plotFunction && !simplePlotFunction) return; - - jkqtpSimplePlotFunctionType func; - if (plotFunction) func=std::bind(plotFunction, std::placeholders::_1, getInternalParams()); - else if (simplePlotFunction) func=simplePlotFunction; - - const double ymin=parent->getYMin(); - const double ymax=parent->getYMax(); - - std::function fTransformedFunc= std::bind([&](const JKQTPPlotElement* plot, double y) -> QPointF { return plot->transform(func(y), y); }, this, std::placeholders::_1); - - JKQTPAdaptiveFunctionGraphEvaluator evaluator(fTransformedFunc, minSamples, maxRefinementDegree, slopeTolerance, minPixelPerSample); - data=evaluator.evaluate(ymin, ymax); - data=JKQTPSimplyfyLineSegemnts(data, dataCleanupMaxAllowedAngleDegree); - } - - - -QBrush JKQTPXFunctionLineGraph::getErrorBrush(JKQTPEnhancedPainter& /*painter*/) const { - QBrush b; - b.setColor(errorFillColor); - b.setStyle(errorFillStyle); - return b; -} - -QPen JKQTPXFunctionLineGraph::getErrorLinePen(JKQTPEnhancedPainter& painter) const { - QPen p; - p.setColor(errorColor); - p.setWidthF(qMax(JKQTPlotterDrawingTools::ABS_MIN_LINEWIDTH,parent->pt2px(painter, parent->getLineWidthMultiplier()*errorLineWidth))); - p.setStyle(errorStyle); - p.setJoinStyle(Qt::RoundJoin); - p.setCapStyle(Qt::RoundCap); - - return p; -} - - - -void JKQTPXFunctionLineGraph::setErrorParams(const QVector &errorParams) +JKQTPFunctorLineGraphBase::JKQTPFunctorLineGraphBase(const jkqtpSimplePlotFunctionType &f, const QString &title_, JKQTPlotter *parent): + JKQTPFunctorLineGraphBase(f, title_, parent->getPlotter()) { - ierrorparams=errorParams; - setErrorParams(&ierrorparams); } -void JKQTPXFunctionLineGraph::setErrorParameterColumn(int __value) +JKQTPFunctorLineGraphBase::JKQTPFunctorLineGraphBase(jkqtpSimplePlotFunctionType &&f, const QString &title_, JKQTBasePlotter *parent): + JKQTPFunctorLineGraphBase(parent) { - this->errorParameterColumn = __value; + title=title_; + plotFunction=jkqtpPlotFunctionType(); + simplePlotFunction=std::move(f); + data.clear(); } -int JKQTPXFunctionLineGraph::getErrorParameterColumn() const +JKQTPFunctorLineGraphBase::JKQTPFunctorLineGraphBase(jkqtpSimplePlotFunctionType &&f, const QString &title_, JKQTPlotter *parent): + JKQTPFunctorLineGraphBase(std::move(f), title_, parent->getPlotter()) { - return this->errorParameterColumn; + } -void JKQTPXFunctionLineGraph::setErrorParameterColumn(size_t __value) { - this->errorParameterColumn = static_cast(__value); -} - -void JKQTPXFunctionLineGraph::setErrorLineColor(const QColor &__value) +JKQTPFunctorLineGraphBase::JKQTPFunctorLineGraphBase(JKQTPFunctorLineGraphBase::SpecialFunction type, const QVector ¶ms, const QString &title_, JKQTBasePlotter *parent): + JKQTPFunctorLineGraphBase(parent) { - this->errorColor = __value; + title=title_; + setSpecialFunction(type); + setParams(params); + data.clear(); } -QColor JKQTPXFunctionLineGraph::getErrorLineColor() const +JKQTPFunctorLineGraphBase::JKQTPFunctorLineGraphBase(JKQTPFunctorLineGraphBase::SpecialFunction type, const QVector ¶ms, const QString &title, JKQTPlotter *parent): + JKQTPFunctorLineGraphBase(type, params, title, parent->getPlotter()) { - return this->errorColor; + } -void JKQTPXFunctionLineGraph::setErrorFillColor(const QColor &__value) -{ - this->errorFillColor = __value; + +JKQTPFunctorLineGraphBase::~JKQTPFunctorLineGraphBase() { + } -QColor JKQTPXFunctionLineGraph::getErrorFillColor() const +void JKQTPFunctorLineGraphBase::setSpecialFunction(JKQTPFunctorLineGraphBase::SpecialFunction function) { - return this->errorFillColor; -} - -void JKQTPXFunctionLineGraph::setErrorFillStyle(Qt::BrushStyle __value) -{ - this->errorFillStyle = __value; -} - -Qt::BrushStyle JKQTPXFunctionLineGraph::getErrorFillStyle() const -{ - return this->errorFillStyle; -} - -void JKQTPXFunctionLineGraph::setErrorLineStyle(Qt::PenStyle __value) -{ - this->errorStyle = __value; -} - -Qt::PenStyle JKQTPXFunctionLineGraph::getErrorLineStyle() const -{ - return this->errorStyle; -} - -void JKQTPXFunctionLineGraph::setErrorLineWidth(double __value) -{ - this->errorLineWidth = __value; -} - -double JKQTPXFunctionLineGraph::getErrorLineWidth() const -{ - return this->errorLineWidth; -} - -void JKQTPXFunctionLineGraph::setSpecialFunction(JKQTPXFunctionLineGraph::SpecialFunction function) -{ - if (function==JKQTPXFunctionLineGraph::Polynomial) { + if (function==JKQTPFunctorLineGraphBase::Polynomial) { setPlotFunctionFunctor([](double x, const QVector& param) { double res=0; if (param.size()>0) { @@ -705,7 +540,7 @@ void JKQTPXFunctionLineGraph::setSpecialFunction(JKQTPXFunctionLineGraph::Specia return res; }); } - else if (function==JKQTPXFunctionLineGraph::Exponential) setPlotFunctionFunctor([](double x, const QVector& param) { + else if (function==JKQTPFunctorLineGraphBase::Exponential) setPlotFunctionFunctor([](double x, const QVector& param) { double res=0; if (param.size()>=3) { res=param.value(0,0)+param.value(1,0)*exp(x/param.value(2,0)); @@ -714,7 +549,7 @@ void JKQTPXFunctionLineGraph::setSpecialFunction(JKQTPXFunctionLineGraph::Specia } return res; }); - else if (function==JKQTPXFunctionLineGraph::PowerLaw) setPlotFunctionFunctor([](double x, const QVector& param) { + else if (function==JKQTPFunctorLineGraphBase::PowerLaw) setPlotFunctionFunctor([](double x, const QVector& param) { double res=0; if (param.size()>=3) { res=param.value(0,0)+param.value(1,0)*pow(x, param.value(2,1)); @@ -728,84 +563,279 @@ void JKQTPXFunctionLineGraph::setSpecialFunction(JKQTPXFunctionLineGraph::Specia else throw std::runtime_error("unknown special function type"); } -JKQTPXFunctionLineGraph::SpecialFunction JKQTPXFunctionLineGraph::getFunctionType() const -{ - return functionType; -} -QVector JKQTPXFunctionLineGraph::getInternalErrorParams() const { - return ierrorparams; -} - -void JKQTPXFunctionLineGraph::setDrawErrorPolygons(bool __value) -{ - this->drawErrorPolygons = __value; -} - -bool JKQTPXFunctionLineGraph::getDrawErrorPolygons() const -{ - return this->drawErrorPolygons; -} - -void JKQTPXFunctionLineGraph::setDrawErrorLines(bool __value) -{ - this->drawErrorLines = __value; -} - -bool JKQTPXFunctionLineGraph::getDrawErrorLines() const -{ - return this->drawErrorLines; -} - -void JKQTPXFunctionLineGraph::setErrorPlotFunction(const jkqtpPlotFunctionType &__value) +void JKQTPFunctorLineGraphBase::setErrorPlotFunction(const jkqtpPlotFunctionType &__value) { errorSimplePlotFunction=jkqtpSimplePlotFunctionType(); errorPlotFunction=__value; data.clear(); } -void JKQTPXFunctionLineGraph::setErrorPlotFunction(jkqtpPlotFunctionType &&__value) +void JKQTPFunctorLineGraphBase::setErrorPlotFunction(jkqtpPlotFunctionType &&__value) { errorSimplePlotFunction=jkqtpSimplePlotFunctionType(); errorPlotFunction = std::move(__value); data.clear(); } -jkqtpPlotFunctionType JKQTPXFunctionLineGraph::getErrorPlotFunction() const +jkqtpPlotFunctionType JKQTPFunctorLineGraphBase::getErrorPlotFunction() const { return errorPlotFunction; } -void JKQTPXFunctionLineGraph::setErrorPlotFunction(const jkqtpSimplePlotFunctionType &__value) +void JKQTPFunctorLineGraphBase::setErrorPlotFunction(const jkqtpSimplePlotFunctionType &__value) { errorPlotFunction=jkqtpPlotFunctionType(); errorSimplePlotFunction=__value; data.clear(); } -void JKQTPXFunctionLineGraph::setErrorPlotFunction(jkqtpSimplePlotFunctionType &&__value) +void JKQTPFunctorLineGraphBase::setErrorPlotFunction(jkqtpSimplePlotFunctionType &&__value) { errorPlotFunction=jkqtpPlotFunctionType(); errorSimplePlotFunction = std::move(__value); data.clear(); } -jkqtpSimplePlotFunctionType JKQTPXFunctionLineGraph::getErrorSimplePlotFunction() const + +jkqtpSimplePlotFunctionType JKQTPFunctorLineGraphBase::getErrorSimplePlotFunction() const { return errorSimplePlotFunction; } -void JKQTPXFunctionLineGraph::setErrorParams(void *__value) +void JKQTPFunctorLineGraphBase::setPlotFunctionFunctor(const jkqtpPlotFunctionType &__value) { - this->errorParams = __value; + simplePlotFunction=jkqtpSimplePlotFunctionType(); + plotFunction = __value; + data.clear(); } -void *JKQTPXFunctionLineGraph::getErrorParams() const +void JKQTPFunctorLineGraphBase::setPlotFunctionFunctor(const jkqtpSimplePlotFunctionType &__value) { - return this->errorParams; + plotFunction=jkqtpPlotFunctionType(); + simplePlotFunction=__value; + data.clear(); +} + +void JKQTPFunctorLineGraphBase::setPlotFunctionFunctor(jkqtpPlotFunctionType &&__value) +{ + simplePlotFunction=jkqtpSimplePlotFunctionType(); + plotFunction = std::move(__value); + data.clear(); +} + +void JKQTPFunctorLineGraphBase::setPlotFunctionFunctor(jkqtpSimplePlotFunctionType &&__value) +{ + plotFunction=jkqtpPlotFunctionType(); + simplePlotFunction=std::move(__value); + data.clear(); +} + +jkqtpPlotFunctionType JKQTPFunctorLineGraphBase::getPlotFunctionFunctor() const +{ + return plotFunction; +} + +jkqtpSimplePlotFunctionType JKQTPFunctorLineGraphBase::getSimplePlotFunction() const +{ + return simplePlotFunction; +} + +bool JKQTPFunctorLineGraphBase::isSimplePlotFunction() const +{ + return !static_cast(plotFunction) && static_cast(simplePlotFunction); } -bool JKQTPXFunctionLineGraph::usesColumn(int c) const + + + + +JKQTPXFunctionLineGraph::JKQTPXFunctionLineGraph(JKQTBasePlotter* parent): + JKQTPFunctorLineGraphBase(parent) { - return JKQTPEvaluatedFunctionWithParamsGraphBase::usesColumn(c)||(c==errorParameterColumn); + } +JKQTPXFunctionLineGraph::JKQTPXFunctionLineGraph(JKQTPlotter* parent): + JKQTPFunctorLineGraphBase(parent) +{ + +} + +JKQTPXFunctionLineGraph::JKQTPXFunctionLineGraph(const jkqtpSimplePlotFunctionType &f, const QString &title_, JKQTBasePlotter *parent): + JKQTPFunctorLineGraphBase(f, title_, parent) +{ +} + +JKQTPXFunctionLineGraph::JKQTPXFunctionLineGraph(const jkqtpSimplePlotFunctionType &f, const QString &title_, JKQTPlotter *parent): + JKQTPFunctorLineGraphBase(f, title_, parent) +{ +} + +JKQTPXFunctionLineGraph::JKQTPXFunctionLineGraph(jkqtpSimplePlotFunctionType &&f, const QString &title_, JKQTBasePlotter *parent): + JKQTPFunctorLineGraphBase(std::move(f), title_, parent) +{ +} + +JKQTPXFunctionLineGraph::JKQTPXFunctionLineGraph(jkqtpSimplePlotFunctionType &&f, const QString &title_, JKQTPlotter *parent): + JKQTPFunctorLineGraphBase(std::move(f), title_, parent) +{ + +} + +JKQTPXFunctionLineGraph::JKQTPXFunctionLineGraph(JKQTPXFunctionLineGraph::SpecialFunction type, const QVector ¶ms, const QString &title_, JKQTBasePlotter *parent): + JKQTPFunctorLineGraphBase(type, params, title_, parent) +{ +} + +JKQTPXFunctionLineGraph::JKQTPXFunctionLineGraph(JKQTPXFunctionLineGraph::SpecialFunction type, const QVector ¶ms, const QString &title, JKQTPlotter *parent): + JKQTPFunctorLineGraphBase(type, params, title, parent) +{ + +} + + +JKQTPXFunctionLineGraph::~JKQTPXFunctionLineGraph() { + +} + +void JKQTPXFunctionLineGraph::draw(JKQTPEnhancedPainter &painter) +{ + drawXGraph(painter); +} + + +JKQTPEvaluatedFunctionGraphBase::PlotFunctorSpec JKQTPXFunctionLineGraph::buildPlotFunctorSpec() +{ + JKQTPEvaluatedFunctionGraphBase::PlotFunctorSpec spec; + + if (parent==nullptr) return spec; // return an invalid PlotFunctorSpec + if (!plotFunction && !simplePlotFunction) return spec; // return an invalid PlotFunctorSpec + + // range over which to evaluate func + spec.range_start=parent->getXMin(); + spec.range_end=parent->getXMax(); + + // the actual function to use + if (plotFunction) spec.func=std::bind([&](double x, const QVector& p) -> QPointF { return QPointF(x, plotFunction(x, p)); }, std::placeholders::_1, getInternalParams()); + else if (simplePlotFunction) spec.func=[&](double x) -> QPointF { return QPointF(x, simplePlotFunction(x)); }; + + return spec; +} + +std::function JKQTPXFunctionLineGraph::buildErrorFunctorSpec() +{ + std::function spec; + if (parent==nullptr) return spec; // return an invalid PlotFunctorSpec + if (!plotFunction && !simplePlotFunction) return spec; // return an invalid PlotFunctorSpec + + // the actual function to use + if (errorPlotFunction) spec=std::bind([&](double x, const QVector& p) -> QPointF { return QPointF(0, errorPlotFunction(x, p)); }, std::placeholders::_1, getInternalParams()); + else if (errorSimplePlotFunction) spec=[&](double x) -> QPointF { return QPointF(0, errorSimplePlotFunction(x)); }; + + return spec; +} + + + + + + + + + + + + + + +JKQTPYFunctionLineGraph::JKQTPYFunctionLineGraph(JKQTBasePlotter *parent): + JKQTPFunctorLineGraphBase(parent) +{ + +} + +JKQTPYFunctionLineGraph::JKQTPYFunctionLineGraph(JKQTPlotter *parent): + JKQTPYFunctionLineGraph(parent->getPlotter()) +{ + +} + +JKQTPYFunctionLineGraph::JKQTPYFunctionLineGraph(const jkqtpSimplePlotFunctionType &f, const QString &title, JKQTBasePlotter *parent): + JKQTPFunctorLineGraphBase(f, title, parent) +{ + +} + +JKQTPYFunctionLineGraph::JKQTPYFunctionLineGraph(const jkqtpSimplePlotFunctionType &f, const QString &title, JKQTPlotter *parent): + JKQTPFunctorLineGraphBase(f, title, parent) +{ + +} + + +JKQTPYFunctionLineGraph::JKQTPYFunctionLineGraph(jkqtpSimplePlotFunctionType &&f, const QString &title, JKQTBasePlotter *parent): + JKQTPFunctorLineGraphBase(std::move(f), title, parent) +{ + +} + + +JKQTPYFunctionLineGraph::JKQTPYFunctionLineGraph(jkqtpSimplePlotFunctionType &&f, const QString &title, JKQTPlotter *parent): + JKQTPFunctorLineGraphBase(std::move(f), title, parent) +{ + +} + + +JKQTPYFunctionLineGraph::JKQTPYFunctionLineGraph(JKQTPYFunctionLineGraph::SpecialFunction type, const QVector ¶ms, const QString &title_, JKQTBasePlotter *parent): + JKQTPFunctorLineGraphBase(type, params, title_, parent) +{ +} + +JKQTPYFunctionLineGraph::JKQTPYFunctionLineGraph(JKQTPYFunctionLineGraph::SpecialFunction type, const QVector ¶ms, const QString &title_, JKQTPlotter *parent): + JKQTPFunctorLineGraphBase(type, params, title_, parent) +{ + +} + +void JKQTPYFunctionLineGraph::draw(JKQTPEnhancedPainter &painter) +{ + drawYGraph(painter); +} + +JKQTPEvaluatedFunctionGraphBase::PlotFunctorSpec JKQTPYFunctionLineGraph::buildPlotFunctorSpec() +{ + JKQTPEvaluatedFunctionGraphBase::PlotFunctorSpec spec; + + if (parent==nullptr) return spec; // return an invalid PlotFunctorSpec + if (!plotFunction && !simplePlotFunction) return spec; // return an invalid PlotFunctorSpec + + // range over which to evaluate func + spec.range_start=parent->getYMin(); + spec.range_end=parent->getYMax(); + + // the actual function to use + if (plotFunction) spec.func=std::bind([&](double y, const QVector& p) -> QPointF { return QPointF(plotFunction(y, p), y); }, std::placeholders::_1, getInternalParams()); + else if (simplePlotFunction) spec.func=[&](double y) -> QPointF { return QPointF(simplePlotFunction(y), y); }; + + return spec; +} + +std::function JKQTPYFunctionLineGraph::buildErrorFunctorSpec() +{ + std::function spec; + if (parent==nullptr) return spec; // return an invalid PlotFunctorSpec + if (!plotFunction && !simplePlotFunction) return spec; // return an invalid PlotFunctorSpec + + // the actual function to use + if (errorPlotFunction) spec=std::bind([&](double y, const QVector& p) -> QPointF { return QPointF(errorPlotFunction(y, p), 0); }, std::placeholders::_1, getInternalParams()); + else if (errorSimplePlotFunction) spec=[&](double y) -> QPointF { return QPointF(errorSimplePlotFunction(y), 0); }; + + return spec; +} + + + + + + diff --git a/lib/jkqtplotter/graphs/jkqtpevaluatedfunction.h b/lib/jkqtplotter/graphs/jkqtpevaluatedfunction.h index 246227409c..970a04f544 100644 --- a/lib/jkqtplotter/graphs/jkqtpevaluatedfunction.h +++ b/lib/jkqtplotter/graphs/jkqtpevaluatedfunction.h @@ -33,6 +33,118 @@ #define jkqtpgraphsevaluatedfunction_H +/** \brief This class extends JKQTPEvaluatedFunctionWithErrorsGraphBase with functions to draw the graphs and + * set the drawing style + * \ingroup jkqtplotter_functiongraphs + * + * \note Since this class is meant as a base for both f(x)- and f(y)-functions, it cannot + * implememt JKQTPGraph::draw(). Therefore it provides two implementations drawXGraph() + * and drawYGraph() and the user has to decide in the concrete graph class, which one to call + * (or whether to do the drawing completely different). + * + * \see e.g. JKQTPXFunctionLineGraph for a concrete implementation + */ +class JKQTPLOTTER_LIB_EXPORT JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase: public JKQTPEvaluatedFunctionWithErrorsGraphBase, public JKQTPGraphLineStyleMixin, public JKQTPGraphFillStyleMixin { + Q_OBJECT + public: + + /** \brief class constructor */ + JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase(JKQTBasePlotter* parent=nullptr); + + /** \brief class constructor */ + JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase(JKQTPlotter* parent); + + /** \brief class destructor */ + virtual ~JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase() 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 */ + virtual QColor getKeyLabelColor() const override; + + /*! \copydoc drawLine */ + bool getDrawLine() const; + + + /*! \copydoc drawErrorPolygons */ + bool getDrawErrorPolygons() const; + /*! \copydoc drawErrorLines */ + bool getDrawErrorLines() const; + /*! \copydoc errorColor */ + virtual QColor getErrorLineColor() const; + /*! \copydoc errorFillColor */ + virtual QColor getErrorFillColor() const; + /*! \copydoc errorFillStyle */ + virtual Qt::BrushStyle getErrorFillStyle() const; + /*! \copydoc errorStyle */ + virtual Qt::PenStyle getErrorLineStyle() const; + /*! \copydoc errorLineWidth */ + virtual double getErrorLineWidth() const; + + + + + + public slots: + /*! \brief set color, fill color and error color at the same time */ + void setColor(QColor c); + + /*! \copydoc drawLine */ + void setDrawLine(bool __value); + /*! \copydoc drawErrorPolygons */ + void setDrawErrorPolygons(bool __value); + /*! \copydoc drawErrorLines */ + void setDrawErrorLines(bool __value); + /*! \copydoc errorColor */ + virtual void setErrorLineColor(const QColor & __value); + /*! \copydoc errorFillColor */ + virtual void setErrorFillColor(const QColor & __value); + /*! \copydoc errorFillStyle */ + virtual void setErrorFillStyle(Qt::BrushStyle __value); + /*! \copydoc errorStyle */ + virtual void setErrorLineStyle(Qt::PenStyle __value); + /*! \copydoc errorLineWidth */ + virtual void setErrorLineWidth(double __value); + + protected: + /** \brief plots the graph to the plotter object specified as parent */ + void drawXGraph(JKQTPEnhancedPainter& painter); + /** \brief plots the graph to the plotter object specified as parent */ + void drawYGraph(JKQTPEnhancedPainter& painter); + + + + + /** \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 indicates whether an error polygon should be drawn */ + bool drawErrorPolygons; + /** \brief indicates whether error lines should be drawn */ + bool drawErrorLines; + + + + /** \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; + +}; + /*! \brief type of functions that may be plotted by JKQTPXFunctionLineGraph and JKQTPYFunctionLineGraph @@ -54,84 +166,43 @@ typedef std::function&)> jkqtpPlotFunctionT typedef std::function jkqtpSimplePlotFunctionType; -/*! \brief This implements line plots where the data is taken from a user supplied function \f$ y=f(x) \f$ - \ingroup jkqtplotter_functiongraphs - This class uses the intelligent plotting algorithm for functions, implemented in JKQTPAdaptiveFunctionGraphEvaluator. - 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. - - Finally the obtained data is cleaned up to reduce the amount of points, by deleting a point, when it leads to an - angle between consecutive line-segments of less than dataCleanupMaxAllowedAngleDegree. - - The following image shows some example graphs: - - \image html plot_functionplots.png - - \see \ref JKQTPlotterFunctionPlots, JKQTPAdaptiveFunctionGraphEvaluator, JKQTPYFunctionLineGraph, JKQTPXYFunctionLineGraph, jkqtpstatAddPolyFit(), jkqtpstatAddWeightedRegression(), jkqtpstatAddRobustIRLSRegression(), jkqtpstatAddRegression(), jkqtpstatAddLinearWeightedRegression(), jkqtpstatAddRobustIRLSLinearRegression(), jkqtpstatAddLinearRegression() +/** \brief extends JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase with the capabilities to define functions from C++-functors + * of type jkqtpSimplePlotFunctionType or jkqtpPlotFunctionType + * \ingroup jkqtplotter_functiongraphs + * + * \see JKQTPXFunctionLineGraph and JKQTPYFunctionLineGraph for a concrete implementation */ -class JKQTPLOTTER_LIB_EXPORT JKQTPXFunctionLineGraph: public JKQTPEvaluatedFunctionWithParamsGraphBase, public JKQTPGraphLineStyleMixin, public JKQTPGraphFillStyleMixin { +class JKQTPLOTTER_LIB_EXPORT JKQTPFunctorLineGraphBase: public JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase { 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 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 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 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 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 */ - JKQTPXFunctionLineGraph(JKQTBasePlotter* parent=nullptr); + JKQTPFunctorLineGraphBase(JKQTBasePlotter* parent=nullptr); /** \brief class constructor */ - JKQTPXFunctionLineGraph(JKQTPlotter* parent); + JKQTPFunctorLineGraphBase(JKQTPlotter* parent); /** \brief class constructor */ - JKQTPXFunctionLineGraph(const jkqtpSimplePlotFunctionType & f, const QString& title, JKQTBasePlotter* parent=nullptr); + JKQTPFunctorLineGraphBase(const jkqtpSimplePlotFunctionType & f, const QString& title, JKQTBasePlotter* parent=nullptr); /** \brief class constructor */ - JKQTPXFunctionLineGraph(const jkqtpSimplePlotFunctionType & f, const QString& title, JKQTPlotter* parent); + JKQTPFunctorLineGraphBase(const jkqtpSimplePlotFunctionType & f, const QString& title, JKQTPlotter* parent); /** \brief class constructor */ - JKQTPXFunctionLineGraph(jkqtpSimplePlotFunctionType && f, const QString& title, JKQTBasePlotter* parent=nullptr); + JKQTPFunctorLineGraphBase(jkqtpSimplePlotFunctionType && f, const QString& title, JKQTBasePlotter* parent=nullptr); /** \brief class constructor */ - JKQTPXFunctionLineGraph(jkqtpSimplePlotFunctionType && f, const QString& title, JKQTPlotter* parent); + JKQTPFunctorLineGraphBase(jkqtpSimplePlotFunctionType && f, const QString& title, JKQTPlotter* parent); /** \brief class constructor */ - JKQTPXFunctionLineGraph(SpecialFunction type, const QVector& params, const QString& title, JKQTBasePlotter* parent); + JKQTPFunctorLineGraphBase(SpecialFunction type, const QVector& params, const QString& title, JKQTBasePlotter* parent); /** \brief class constructor */ - JKQTPXFunctionLineGraph(SpecialFunction type, const QVector& params, const QString& title, JKQTPlotter* parent); + JKQTPFunctorLineGraphBase(SpecialFunction type, const QVector& params, const QString& title, JKQTPlotter* parent); /** \brief class destructor */ - virtual ~JKQTPXFunctionLineGraph() override; - - /** \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 */ - virtual QColor getKeyLabelColor() const override; - - /** \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 set color, fill color and error color at the same time */ - void setColor(QColor c); - - /*! \copydoc drawLine */ - void setDrawLine(bool __value); - /*! \copydoc drawLine */ - bool getDrawLine() const; + virtual ~JKQTPFunctorLineGraphBase() override; /** \brief sets a functor to be plotted * @@ -153,23 +224,20 @@ class JKQTPLOTTER_LIB_EXPORT JKQTPXFunctionLineGraph: public JKQTPEvaluatedFunct * \see simplePlotFunction */ virtual void setPlotFunctionFunctor (const jkqtpSimplePlotFunctionType & __value); - /*! \copydoc plotFunction */ \ + /*! \copydoc plotFunction + * + * \see isSimplePlotFunction() */ \ virtual jkqtpPlotFunctionType getPlotFunctionFunctor () const; - /*! \copydoc simplePlotFunction */ \ + /*! \copydoc simplePlotFunction + * + * \see isSimplePlotFunction() */ \ virtual jkqtpSimplePlotFunctionType getSimplePlotFunction () const; + /** \brief returns whether the plot function was defined as a jkqtpSimpleParametricCurveFunctionType (\c true ) or + * a jkqtpParametricCurveFunctionType (\c false ) */ + bool isSimplePlotFunction() const; - /** \brief returns the currently set internal parameter vector */ - QVector getInternalErrorParams() const; - /*! \copydoc drawErrorPolygons */ - void setDrawErrorPolygons(bool __value); - /*! \copydoc drawErrorPolygons */ - bool getDrawErrorPolygons() const; - /*! \copydoc drawErrorLines */ - void setDrawErrorLines(bool __value); - /*! \copydoc drawErrorLines */ - bool getDrawErrorLines() const; /** \brief sets a functor to be used for calculating errors * * \see errorPlotFunction @@ -194,100 +262,73 @@ class JKQTPLOTTER_LIB_EXPORT JKQTPXFunctionLineGraph: public JKQTPEvaluatedFunct virtual void setErrorPlotFunction (const jkqtpSimplePlotFunctionType & __value); /*! \copydoc errorSimplePlotFunction */ \ virtual jkqtpSimplePlotFunctionType getErrorSimplePlotFunction () const; - /*! \copydoc errorParams */ - virtual void setErrorParams(void* __value); - /*! \copydoc errorParams */ - void *getErrorParams() const; - /** \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!!!) */ - void setErrorParams(const QVector& errorParams); - /*! \copydoc errorParameterColumn */ - void setErrorParameterColumn(int __value); - /*! \copydoc errorParameterColumn */ - int getErrorParameterColumn() const; - /*! \copydoc errorParameterColumn */ - void setErrorParameterColumn (size_t __value); - /*! \copydoc errorColor */ - virtual void setErrorLineColor(const QColor & __value); - /*! \copydoc errorColor */ - virtual QColor getErrorLineColor() const; - /*! \copydoc errorFillColor */ - virtual void setErrorFillColor(const QColor & __value); - /*! \copydoc errorFillColor */ - virtual QColor getErrorFillColor() const; - /*! \copydoc errorFillStyle */ - virtual void setErrorFillStyle(Qt::BrushStyle __value); - /*! \copydoc errorFillStyle */ - virtual Qt::BrushStyle getErrorFillStyle() const; - /*! \copydoc errorStyle */ - virtual void setErrorLineStyle(Qt::PenStyle __value); - /*! \copydoc errorStyle */ - virtual Qt::PenStyle getErrorLineStyle() const; - /*! \copydoc errorLineWidth */ - virtual void setErrorLineWidth(double __value); - /*! \copydoc errorLineWidth */ - virtual double getErrorLineWidth() const; - - /** \copydoc JKQTPGraph::usesColumn() */ - 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: - /** \brief ensure that current function parameters for plotFunction (which may stem from different sources, as direct data, a datastore column ...) are stored in iparams and ierrorparams */ - virtual void collectParameters() override; - - - /** \brief fill the data array with data from the function plotFunction */ - virtual void createPlotData( bool collectParams=true) override; - - - /** \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 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; +}; - /** \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; +/*! \brief This implements line plots where the data is taken from a user supplied function \f$ y=f(x) \f$ + \ingroup jkqtplotter_functiongraphs + + This class uses the intelligent plotting algorithm for functions, implemented in JKQTPAdaptiveFunctionGraphEvaluator. + + The following image shows some example graphs: + + \image html plot_functionplots.png + + \see \ref JKQTPlotterFunctionPlots, JKQTPAdaptiveFunctionGraphEvaluator, JKQTPYFunctionLineGraph, JKQTPXYFunctionLineGraph, jkqtpstatAddPolyFit(), jkqtpstatAddWeightedRegression(), jkqtpstatAddRobustIRLSRegression(), jkqtpstatAddRegression(), jkqtpstatAddLinearWeightedRegression(), jkqtpstatAddRobustIRLSLinearRegression(), jkqtpstatAddLinearRegression() + */ +class JKQTPLOTTER_LIB_EXPORT JKQTPXFunctionLineGraph: public JKQTPFunctorLineGraphBase { + Q_OBJECT + public: - QBrush getErrorBrush(JKQTPEnhancedPainter& painter) const; - QPen getErrorLinePen(JKQTPEnhancedPainter &painter) const; - /** \brief internal storage for the current error function parameters for errorPlotFunction (which may stem from different sources, as direct data, a datastore column ...) */ - QVector ierrorparams; + /** \brief class constructor */ + JKQTPXFunctionLineGraph(JKQTBasePlotter* parent=nullptr); + + /** \brief class constructor */ + JKQTPXFunctionLineGraph(JKQTPlotter* parent); + /** \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); + /** \brief class constructor */ + JKQTPXFunctionLineGraph(SpecialFunction type, const QVector& params, const QString& title, JKQTBasePlotter* parent); + /** \brief class constructor */ + JKQTPXFunctionLineGraph(SpecialFunction type, const QVector& params, const QString& title, JKQTPlotter* parent); + + /** \brief class destructor */ + virtual ~JKQTPXFunctionLineGraph() override; + + /** \brief plots the graph to the plotter object specified as parent */ + virtual void draw(JKQTPEnhancedPainter& painter) override; + + protected: + + /** \copydoc JKQTPEvaluatedFunctionGraphBase::buildPlotFunctorSpec() */ + virtual PlotFunctorSpec buildPlotFunctorSpec() override; + + /** \copydoc JKQTPEvaluatedFunctionWithErrorsGraphBase::buildPlotFunctorSpec() */ + virtual std::function buildErrorFunctorSpec() override; + }; /*! \brief This implements line plots where the data is taken from a user supplied function \f$ x=f(y) \f$ @@ -299,7 +340,7 @@ class JKQTPLOTTER_LIB_EXPORT JKQTPXFunctionLineGraph: public JKQTPEvaluatedFunct \see \ref JKQTPlotterFunctionPlots , JKQTPXFunctionLineGraph, JKQTPXYFunctionLineGraph */ -class JKQTPLOTTER_LIB_EXPORT JKQTPYFunctionLineGraph: public JKQTPXFunctionLineGraph { +class JKQTPLOTTER_LIB_EXPORT JKQTPYFunctionLineGraph: public JKQTPFunctorLineGraphBase { Q_OBJECT public: /** \brief class constructor */ @@ -323,8 +364,11 @@ class JKQTPLOTTER_LIB_EXPORT JKQTPYFunctionLineGraph: public JKQTPXFunctionLineG 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; + /** \copydoc JKQTPEvaluatedFunctionGraphBase::buildPlotFunctorSpec() */ + virtual PlotFunctorSpec buildPlotFunctorSpec() override; + + /** \copydoc JKQTPEvaluatedFunctionWithErrorsGraphBase::buildPlotFunctorSpec() */ + virtual std::function buildErrorFunctorSpec() override; }; diff --git a/lib/jkqtplotter/graphs/jkqtpevaluatedfunctionbase.cpp b/lib/jkqtplotter/graphs/jkqtpevaluatedfunctionbase.cpp index 103362b109..d46a06a1fb 100644 --- a/lib/jkqtplotter/graphs/jkqtpevaluatedfunctionbase.cpp +++ b/lib/jkqtplotter/graphs/jkqtpevaluatedfunctionbase.cpp @@ -35,16 +35,17 @@ JKQTPEvaluatedFunctionGraphBase::JKQTPEvaluatedFunctionGraphBase(JKQTBasePlotter* parent): - JKQTPGraph(parent) + JKQTPGraph(parent), + parameterColumn(-1), + minSamples(50), + maxRefinementDegree(5), + slopeTolerance(0.005), + minPixelPerSample(32), + dataCleanupMaxAllowedAngleDegree(0.2), + displaySamplePoints(false) { - minSamples=50; - maxRefinementDegree=5; - slopeTolerance=0.005; - minPixelPerSample=32; - dataCleanupMaxAllowedAngleDegree=0.2; - displaySamplePoints=false; data.clear(); - + iparams.clear(); } JKQTPEvaluatedFunctionGraphBase::JKQTPEvaluatedFunctionGraphBase(JKQTPlotter* parent): @@ -127,6 +128,24 @@ void JKQTPEvaluatedFunctionGraphBase::setDisplaySamplePoints(bool __value) this->displaySamplePoints = __value; } +void JKQTPEvaluatedFunctionGraphBase::createPlotData(bool collectParams) +{ +#ifdef JKQTBP_AUTOTIMER + JKQTPAutoOutputTimer jkaat(QString("JKQTPEvaluatedFunctionWithErrorsGraphBase[%1]::createPlotData()").arg(title)); +#endif + data.clear(); + if (collectParams) collectParameters(); + PlotFunctorSpec plotfunc= buildPlotFunctorSpec(); + + if (plotfunc.isValid()) { + std::function fTransformedFunc= std::bind([plotfunc](const JKQTPPlotElement* plot, double t) -> QPointF { return plot->transform(plotfunc.func(t)); }, this, std::placeholders::_1); + + JKQTPAdaptiveFunctionGraphEvaluator evaluator(fTransformedFunc, minSamples, maxRefinementDegree, slopeTolerance, minPixelPerSample); + data=evaluator.evaluate(plotfunc.range_start, plotfunc.range_end); + data=JKQTPSimplyfyLineSegemnts(data, dataCleanupMaxAllowedAngleDegree); + } +} + bool JKQTPEvaluatedFunctionGraphBase::getDisplaySamplePoints() const { return this->displaySamplePoints; @@ -181,25 +200,7 @@ bool JKQTPEvaluatedFunctionGraphBase::getYMinMax(double &miny, double &maxy, dou } - -JKQTPEvaluatedFunctionWithParamsGraphBase::JKQTPEvaluatedFunctionWithParamsGraphBase(JKQTBasePlotter *parent): - parameterColumn(-1) -{ - -} - -JKQTPEvaluatedFunctionWithParamsGraphBase::JKQTPEvaluatedFunctionWithParamsGraphBase(JKQTPlotter *parent): - JKQTPEvaluatedFunctionWithParamsGraphBase(parent->getPlotter()) -{ - -} - -JKQTPEvaluatedFunctionWithParamsGraphBase::~JKQTPEvaluatedFunctionWithParamsGraphBase() -{ - -} - -void JKQTPEvaluatedFunctionWithParamsGraphBase::collectParameters() +void JKQTPEvaluatedFunctionGraphBase::collectParameters() { if (parent && parameterColumn>=0) { iparams.clear(); @@ -221,67 +222,195 @@ void JKQTPEvaluatedFunctionWithParamsGraphBase::collectParameters() } -void JKQTPEvaluatedFunctionWithParamsGraphBase::setParams(const QVector ¶ms) +void JKQTPEvaluatedFunctionGraphBase::setParams(const QVector ¶ms) { iparams=params; } -void JKQTPEvaluatedFunctionWithParamsGraphBase::setCopiedParams(const double *params, int N) +void JKQTPEvaluatedFunctionGraphBase::setCopiedParams(const double *params, int N) { QVector v; for (int i=0; i p; p< p; p< p; p< p; p< p; p<parameterColumn = __value; } -int JKQTPEvaluatedFunctionWithParamsGraphBase::getParameterColumn() const +int JKQTPEvaluatedFunctionGraphBase::getParameterColumn() const { return this->parameterColumn; } -void JKQTPEvaluatedFunctionWithParamsGraphBase::setParameterColumn(size_t __value) { +void JKQTPEvaluatedFunctionGraphBase::setParameterColumn(size_t __value) { this->parameterColumn = static_cast(__value); } -QVector JKQTPEvaluatedFunctionWithParamsGraphBase::getInternalParams() const { +const QVector& JKQTPEvaluatedFunctionGraphBase::getInternalParams() const { return iparams; } -bool JKQTPEvaluatedFunctionWithParamsGraphBase::usesColumn(int c) const +QVector &JKQTPEvaluatedFunctionGraphBase::getInternalParams() +{ + return iparams; +} + +bool JKQTPEvaluatedFunctionGraphBase::usesColumn(int c) const { return (c==parameterColumn); } + +JKQTPEvaluatedFunctionGraphBase::PlotFunctorSpec::PlotFunctorSpec(): + func(), + range_start(0), + range_end(0) +{ + +} + +bool JKQTPEvaluatedFunctionGraphBase::PlotFunctorSpec::isValid() const +{ + return static_cast(func) && (fabs(range_end-range_start)>0); +} + + + + +JKQTPEvaluatedFunctionWithErrorsGraphBase::JKQTPEvaluatedFunctionWithErrorsGraphBase(JKQTBasePlotter *parent): + JKQTPEvaluatedFunctionGraphBase(parent), + errorParameterColumn(-1) +{ + +} + +JKQTPEvaluatedFunctionWithErrorsGraphBase::JKQTPEvaluatedFunctionWithErrorsGraphBase(JKQTPlotter *parent): + JKQTPEvaluatedFunctionWithErrorsGraphBase(parent->getPlotter()) +{ + +} + +JKQTPEvaluatedFunctionWithErrorsGraphBase::~JKQTPEvaluatedFunctionWithErrorsGraphBase() +{ + +} + +const QVector& JKQTPEvaluatedFunctionWithErrorsGraphBase::getInternalErrorParams() const { + return ierrorparams; +} + +QVector& JKQTPEvaluatedFunctionWithErrorsGraphBase::getInternalErrorParams() { + return ierrorparams; +} + +bool JKQTPEvaluatedFunctionWithErrorsGraphBase::usesColumn(int c) const +{ + return JKQTPEvaluatedFunctionGraphBase::usesColumn(c)||(c==errorParameterColumn); +} + +void JKQTPEvaluatedFunctionWithErrorsGraphBase::setErrorParams(const QVector &errorParams) +{ + ierrorparams=errorParams; +} + +void JKQTPEvaluatedFunctionWithErrorsGraphBase::setErrorParameterColumn(int __value) +{ + this->errorParameterColumn = __value; +} + +int JKQTPEvaluatedFunctionWithErrorsGraphBase::getErrorParameterColumn() const +{ + return this->errorParameterColumn; +} + +void JKQTPEvaluatedFunctionWithErrorsGraphBase::setErrorParameterColumn(size_t __value) { + this->errorParameterColumn = static_cast(__value); +} + +void JKQTPEvaluatedFunctionWithErrorsGraphBase::setErrorParamsV(double p1) +{ + QVector p; + p< p; + p< p; + p< p; + p< p; + p<=0) { + ierrorparams.clear(); + JKQTPDatastore* datastore=parent->getDatastore(); + int imin=0; + int imax= static_cast(datastore->getRows(errorParameterColumn)); + + for (int i=imin; iget(errorParameterColumn,i); + ierrorparams<=0 && !JKQTPIsOKFloat(ierrorparams[i])) { + ierrorparams.remove(i,1); + i--; + } + } +} diff --git a/lib/jkqtplotter/graphs/jkqtpevaluatedfunctionbase.h b/lib/jkqtplotter/graphs/jkqtpevaluatedfunctionbase.h index 728220b28f..4399cb215c 100644 --- a/lib/jkqtplotter/graphs/jkqtpevaluatedfunctionbase.h +++ b/lib/jkqtplotter/graphs/jkqtpevaluatedfunctionbase.h @@ -34,10 +34,26 @@ -/** \brief Base class for graph classes that evaluate a mathematical function (e.g. defined as a C-fucntion), +/** \brief Base class for graph classes that evaluate a mathematical function (e.g. defined as a C-function), * using an adaptive plotting algorithm from JKQTPAdaptiveFunctionGraphEvaluator * \ingroup jkqtplotter_functiongraphs * + * This class always plots a general 2D-graph \f$ [x,y]=\vec{f}(t) \f$ , which is calculated in dependence of + * a parameter \f$ t \f$ . This parametrization is general enough to cover the cases of parametric function, as well as + * x- and y-dependent function graphs: + * - plot a function \f$ f(x) \f$ i.e. the plot points will be \f$ [x, f(x)] \f$ + * and the value rage will be the x-axis range. This is implemented by e.g. JKQTPXFunctionLineGraph. + * - plot a function \f$ f(y) \f$ i.e. the plot points will be \f$ [f(y), y] \f$ + * and the value rage will be the y-axis range. This is implemented by e.g. JKQTPYFunctionLineGraph. + * - plot a function \f$ [x,y]=\vec{f}(t) \f$ i.e. the plot points will be \f$ \vec{f}(t) \f$ + * and the value rage will be a user-defined range for \f$ gt \f$. + * This is implemented by e.g. JKQTPXYFunctionLineGraph. + * . + * + * In order to implement a special cas, one has to override/implement buildPlotFunctorSpec(), which + * returns a functor and a value-range that can represent the cases above. + * + * * This class uses the intelligent plotting algorithm for functions, implemented in JKQTPAdaptiveFunctionGraphEvaluator. * 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$ @@ -50,6 +66,9 @@ * angle between consecutive line-segments of less than dataCleanupMaxAllowedAngleDegree. * * + * + * + * * \see JKQTPAdaptiveFunctionGraphEvaluator, JKQTPXFunctionLineGraph, JKQTPYFunctionLineGraph, JKQTPXYFunctionLineGraph */ class JKQTPLOTTER_LIB_EXPORT JKQTPEvaluatedFunctionGraphBase: public JKQTPGraph { @@ -75,6 +94,21 @@ class JKQTPLOTTER_LIB_EXPORT JKQTPEvaluatedFunctionGraphBase: public JKQTPGraph */ virtual bool getYMinMax(double& miny, double& maxy, double& smallestGreaterZero) override; + /** \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!!!) */ + virtual void setParams(const QVector& params); + /** \brief sets the params from a copy of the given array of length \a N */ + void setCopiedParams(const double* params, int N); + + /** \brief returns the currently set internal parameter vector */ + const QVector& getInternalParams() const; + /** \brief returns the currently set internal parameter vector */ + QVector& getInternalParams(); + /** \copydoc parameterColumn */ + int getParameterColumn() const; + + /** \copydoc JKQTPGraph::usesColumn() */ + virtual bool usesColumn(int c) const override; + /** \copydoc minSamples */ unsigned int getMinSamples() const; @@ -102,12 +136,73 @@ class JKQTPLOTTER_LIB_EXPORT JKQTPEvaluatedFunctionGraphBase: public JKQTPGraph /** \copydoc displaySamplePoints */ void setDisplaySamplePoints(bool __value); + /** \brief set an internal parameter vector as function parameters, initialized with {p1} */ + void setParamsV(double p1); + /** \brief set an internal parameter vector as function parameters, initialized with {p1,p2} */ + void setParamsV(double p1, double p2); + /** \brief set an internal parameter vector as function parameters, initialized with {p1,p2,p3} */ + void setParamsV(double p1, double p2, double p3); + /** \brief set an internal parameter vector as function parameters, initialized with {p1,p2,p3,p4} */ + void setParamsV(double p1, double p2, double p3, double p4); + /** \brief set an internal parameter vector as function parameters, initialized with {p1,p2,p3,p4,p5} */ + void setParamsV(double p1, double p2, double p3, double p4, double p5); + + /** \copydoc parameterColumn */ + void setParameterColumn(int __value); + /** \copydoc parameterColumn */ + void setParameterColumn (size_t __value); + protected: - /** \brief plot data calculated by createPlotData(), i.e. the datapoints \f$ \mbox{transform}\left(x, y=f(x, \vec{p})\right) \f$ to be plotted */ - QVector data; + /** \brief specifies an internal plot functor \see buildPlotFunctor() */ + struct PlotFunctorSpec { + /** brief construct an in-valid PlotFunctorSpec ... will become valid, by assigning a non-zero range and a plot-function */ + PlotFunctorSpec(); + /** \brief calculates the points \f$ [x,y] \f$ on the function graph, in dependence on + * a dependent parameter variable, could be e.g. \f$ [x, f(x)] \f$ for plotting + * a function \f$ f(x) \f$ over the x-axis. */ + std::function func; + /** \brief lower bound for the dependent parameter variable of func */ + double range_start; + /** \brief upper bound for the dependent parameter variable of func */ + double range_end; + + bool isValid() const; + }; + /** \brief this function returns a functor that is used to generate the plot data + * in coordinate space, based on a range of the dependent variable in coordinate space. + * In addition it also contains the value range over which to evaluate the functor PlotFunctorSpec::func + * + * This function has to be overridden by each class. Depending on the way that class defines + * the actual plot function, this function has to compose its return type in different ways. + * The three most common ways are: + * - plot a function \f$ f(x) \f$ i.e. the plot points will be \f$ [x, f(x)] \f$ + * and the value rage will be the x-axis range. This is implemented by e.g. JKQTPXFunctionLineGraph. + * - plot a function \f$ f(y) \f$ i.e. the plot points will be \f$ [f(y), y] \f$ + * and the value rage will be the y-axis range. This is implemented by e.g. JKQTPYFunctionLineGraph. + * - plot a function \f$ [x,y]=\vec{f}(t) \f$ i.e. the plot points will be \f$ \vec{f}(t) \f$ + * and the value rage will be a user-defined range for \f$ gt \f$. + * This is implemented by e.g. JKQTPXYFunctionLineGraph. + * . + */ + virtual PlotFunctorSpec buildPlotFunctorSpec() =0; + + /** \brief ensure that current function parameters for a plot function (which may stem from different sources, as direct data, a datastore column ...) are stored in iparams */ + virtual void collectParameters(); + + /** \brief draw all the sample points in data as small symbols */ + void drawSamplePoints(JKQTPEnhancedPainter &painter, QColor graphColor); /** \brief fill the data array with data from the function plotFunction */ - virtual void createPlotData( bool collectParams=true) =0; + virtual void createPlotData( bool collectParams=true) ; + + /** \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 internal storage for the current function parameters for plotFunction (which may stem from different sources, as direct data, a datastore column ...) */ + QVector iparams; + + /** \brief plot data calculated by createPlotData(), i.e. the datapoints \f$ \mbox{transform}\left(x, y=f(x, \vec{p})\right) \f$ to be plotted */ + QVector data; /** \brief the minimum number of points to evaluate the function at */ unsigned int minSamples; @@ -127,66 +222,75 @@ class JKQTPLOTTER_LIB_EXPORT JKQTPEvaluatedFunctionGraphBase: public JKQTPGraph double dataCleanupMaxAllowedAngleDegree; /** \brief if true [default: off] display the points where the function has been sampled */ bool displaySamplePoints; - - /** \brief draw all the sample points in data as small symbols */ - void drawSamplePoints(JKQTPEnhancedPainter &painter, QColor graphColor); }; -/** \brief extends JKQTPEvaluatedFunctionGraphBase with a set of functions that support function parameters +/** \brief extends JKQTPEvaluatedFunctionGraphBase with some basic properties (e.g. function parameters) + * for a second function that calculates an error (for drawing error indicators) * \ingroup jkqtplotter_functiongraphs * + * When implementing this, you will have to implement buildErrorFunctorSpec() in addition to + * JKQTPEvaluatedFunctionGraphBase::buildPlotFunctorSpec()! + * * \see JKQTPEvaluatedFunctionGraphBase */ -class JKQTPLOTTER_LIB_EXPORT JKQTPEvaluatedFunctionWithParamsGraphBase: public JKQTPEvaluatedFunctionGraphBase { +class JKQTPLOTTER_LIB_EXPORT JKQTPEvaluatedFunctionWithErrorsGraphBase: public JKQTPEvaluatedFunctionGraphBase { Q_OBJECT public: /** \brief class constructor */ - explicit JKQTPEvaluatedFunctionWithParamsGraphBase(JKQTBasePlotter* parent=nullptr); + explicit JKQTPEvaluatedFunctionWithErrorsGraphBase(JKQTBasePlotter* parent=nullptr); /** \brief class constructor */ - explicit JKQTPEvaluatedFunctionWithParamsGraphBase(JKQTPlotter* parent); + explicit JKQTPEvaluatedFunctionWithErrorsGraphBase(JKQTPlotter* parent); /** \brief class destructor */ - virtual ~JKQTPEvaluatedFunctionWithParamsGraphBase(); + virtual ~JKQTPEvaluatedFunctionWithErrorsGraphBase(); - - /** \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!!!) */ - virtual void setParams(const QVector& params); - /** \brief sets the params from a copy of the given array of length \a N */ - void setCopiedParams(const double* params, int N); + /** \copydoc errorParameterColumn */ + int getErrorParameterColumn() const; /** \brief returns the currently set internal parameter vector */ - QVector getInternalParams() const; - /** \copydoc parameterColumn */ - int getParameterColumn() const; + const QVector& getInternalErrorParams() const; + /** \brief returns the currently set internal parameter vector */ + QVector& getInternalErrorParams(); /** \copydoc JKQTPGraph::usesColumn() */ virtual bool usesColumn(int c) const override; - public slots: - /** \brief set an internal parameter vector as function parameters, initialized with {p1} */ - void setParamsV(double p1); - /** \brief set an internal parameter vector as function parameters, initialized with {p1,p2} */ - void setParamsV(double p1, double p2); - /** \brief set an internal parameter vector as function parameters, initialized with {p1,p2,p3} */ - void setParamsV(double p1, double p2, double p3); - /** \brief set an internal parameter vector as function parameters, initialized with {p1,p2,p3,p4} */ - void setParamsV(double p1, double p2, double p3, double p4); - /** \brief set an internal parameter vector as function parameters, initialized with {p1,p2,p3,p4,p5} */ - void setParamsV(double p1, double p2, double p3, double p4, double p5); + /** \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!!!) */ + void setErrorParams(const QVector& errorParams); + /** \copydoc errorParameterColumn */ + void setErrorParameterColumn(int __value); + /** \copydoc errorParameterColumn */ + void setErrorParameterColumn (size_t __value); + + /** \brief set the internal error function parameters to {p1} */ + void setErrorParamsV(double p1); + /** \brief set the internal error function parameters to {p1,p2} */ + void setErrorParamsV(double p1, double p2); + /** \brief set the internal error function parameters to {p1,p2,p3} */ + void setErrorParamsV(double p1, double p2, double p3); + /** \brief set the internal error function parameters to {p1,p2,p3,p4} */ + void setErrorParamsV(double p1, double p2, double p3, double p4); + /** \brief set the internal error function parameters to {p1,p2,p3,p4,p5} */ + void setErrorParamsV(double p1, double p2, double p3, double p4, double p5); - /** \copydoc parameterColumn */ - void setParameterColumn(int __value); - /** \copydoc parameterColumn */ - void setParameterColumn (size_t __value); protected: - /** \brief ensure that current function parameters for a plot function (which may stem from different sources, as direct data, a datastore column ...) are stored in iparams */ - virtual void collectParameters(); + /** \brief ensure that current function parameters for plotFunction (which may stem from different sources, as direct data, a datastore column ...) are stored in iparams and ierrorparams */ + virtual void collectParameters() override; + /** \brief same as JKQTPEvaluatedFunctionGraphBase::buildPlotFunctorSpec(), but for error functions. + * + * The functor, returned by this function should calculate the error of the function (in x- and y-direction) + * for every value \f$ t \f$ of the actual function. + * + * The parameter range is the same as for JKQTPEvaluatedFunctionGraphBase::buildPlotFunctorSpec() + * + * \see JKQTPEvaluatedFunctionGraphBase::buildPlotFunctorSpec() + */ + virtual std::function buildErrorFunctorSpec() =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 internal storage for the current function parameters for plotFunction (which may stem from different sources, as direct data, a datastore column ...) */ - QVector iparams; + /** \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 internal storage for the current error function parameters for errorPlotFunction (which may stem from different sources, as direct data, a datastore column ...) */ + QVector ierrorparams; }; diff --git a/lib/jkqtplotter/graphs/jkqtpevaluatedparametriccurve.cpp b/lib/jkqtplotter/graphs/jkqtpevaluatedparametriccurve.cpp index df0d57f314..536902eb0b 100644 --- a/lib/jkqtplotter/graphs/jkqtpevaluatedparametriccurve.cpp +++ b/lib/jkqtplotter/graphs/jkqtpevaluatedparametriccurve.cpp @@ -33,14 +33,125 @@ -JKQTPXYFunctionLineGraph::JKQTPXYFunctionLineGraph(JKQTBasePlotter* parent): - JKQTPEvaluatedFunctionWithParamsGraphBase(parent) +JKQTPXYFunctionLineGraphBase::JKQTPXYFunctionLineGraphBase(JKQTBasePlotter* parent): + JKQTPEvaluatedFunctionGraphBase(parent), + tmin(0.0), + tmax(1.0) { - tmin=0.0; - tmax=1.0; - initLineStyle(parent, parentPlotStyle); + setMaxRefinementDegree(8); +} +JKQTPXYFunctionLineGraphBase::JKQTPXYFunctionLineGraphBase(JKQTPlotter* parent): + JKQTPXYFunctionLineGraphBase(parent->getPlotter()) +{ + +} + +JKQTPXYFunctionLineGraphBase::~JKQTPXYFunctionLineGraphBase() +{ + +} + + + +void JKQTPXYFunctionLineGraphBase::drawKeyMarker(JKQTPEnhancedPainter& painter, QRectF& rect) { + painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); + QPen p=getLinePen(painter, parent); + p.setJoinStyle(Qt::RoundJoin); + p.setCapStyle(Qt::RoundCap); + QPen np(Qt::NoPen); + const double y=rect.top()+rect.height()/2.0; + painter.setPen(np); + painter.setPen(p); + painter.drawLine(QLineF(rect.left(), y, rect.right(), y)); +} + +QColor JKQTPXYFunctionLineGraphBase::getKeyLabelColor() const { + return getLineColor(); +} + + +void JKQTPXYFunctionLineGraphBase::draw(JKQTPEnhancedPainter& painter) { +#ifdef JKQTBP_AUTOTIMER + JKQTPAutoOutputTimer jkaaot("JKQTPXYFunctionLineGraph::draw"); +#endif + if (parent==nullptr) return; + JKQTPDatastore* datastore=parent->getDatastore(); + if (datastore==nullptr) return; + + //qDebug()<<"start plot\n"; + createPlotData(); + //qDebug()<<"plot data created\n"; + + drawErrorsBefore(painter); + { + painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); + + QPen p=getLinePen(painter, parent); + QPen np(Qt::NoPen); + + + { + painter.save(); auto __finalpaintline=JKQTPFinally([&painter]() {painter.restore();}); + painter.setPen(p); + painter.drawPolyline(data); + } + + + if (displaySamplePoints) drawSamplePoints(painter, getLineColor()); + } + drawErrorsAfter(painter); + //std::cout<<"plot done\n"; +} + + + +double JKQTPXYFunctionLineGraphBase::getTMin() const +{ + return tmin; +} + +double JKQTPXYFunctionLineGraphBase::getTMax() const +{ + return tmax; +} + +void JKQTPXYFunctionLineGraphBase::setTMin(double val) +{ + tmin=val; +} + +void JKQTPXYFunctionLineGraphBase::setTMax(double val) +{ + tmax=val; +} + +QPair JKQTPXYFunctionLineGraphBase::getTRange() const +{ + return QPair(tmin,tmax); +} + +void JKQTPXYFunctionLineGraphBase::setTRange(double tmin_, double tmax_) +{ + tmin=tmin_; + tmax=tmax_; +} + +void JKQTPXYFunctionLineGraphBase::setTRange(const QPair &range) +{ + tmin=range.first; + tmax=range.second; +} + + + + + + +JKQTPXYFunctionLineGraph::JKQTPXYFunctionLineGraph(JKQTBasePlotter* parent): + JKQTPXYFunctionLineGraphBase(parent) +{ } JKQTPXYFunctionLineGraph::JKQTPXYFunctionLineGraph(JKQTPlotter* parent): @@ -54,10 +165,9 @@ JKQTPXYFunctionLineGraph::JKQTPXYFunctionLineGraph(const jkqtpSimpleParametricCu { tmin=tmin_; tmax=tmax_; - title=title_; + setTitle(title_); plotFunction=jkqtpParametricCurveFunctionType(); simplePlotFunction=f; - data.clear(); } JKQTPXYFunctionLineGraph::JKQTPXYFunctionLineGraph(const jkqtpSimpleParametricCurveFunctionType &f, const QString &title_, double tmin_, double tmax_, JKQTPlotter *parent): @@ -72,7 +182,7 @@ JKQTPXYFunctionLineGraph::JKQTPXYFunctionLineGraph(jkqtpSimpleParametricCurveFun { tmin=tmin_; tmax=tmax_; - title=title_; + setTitle(title_); plotFunction=jkqtpParametricCurveFunctionType(); simplePlotFunction=std::move(f); data.clear(); @@ -89,7 +199,7 @@ JKQTPXYFunctionLineGraph::JKQTPXYFunctionLineGraph(jkqtpParametricCurveFunctionT { tmin=tmin_; tmax=tmax_; - title=title_; + setTitle(title_); simplePlotFunction=jkqtpSimpleParametricCurveFunctionType(); plotFunction=std::move(f); data.clear(); @@ -106,7 +216,7 @@ JKQTPXYFunctionLineGraph::JKQTPXYFunctionLineGraph(const jkqtpParametricCurveFun { tmin=tmin_; tmax=tmax_; - title=title_; + setTitle(title_); simplePlotFunction=jkqtpSimpleParametricCurveFunctionType(); plotFunction=std::move(f); data.clear(); @@ -119,7 +229,7 @@ JKQTPXYFunctionLineGraph::JKQTPXYFunctionLineGraph(const jkqtpParametricCurveFun } JKQTPXYFunctionLineGraph::~JKQTPXYFunctionLineGraph() { - data.clear(); + } @@ -162,115 +272,26 @@ jkqtpSimpleParametricCurveFunctionType JKQTPXYFunctionLineGraph::getSimplePlotFu return simplePlotFunction; } - -void JKQTPXYFunctionLineGraph::drawKeyMarker(JKQTPEnhancedPainter& painter, QRectF& rect) { - painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); - QPen p=getLinePen(painter, parent); - p.setJoinStyle(Qt::RoundJoin); - p.setCapStyle(Qt::RoundCap); - QPen np(Qt::NoPen); - const double y=rect.top()+rect.height()/2.0; - painter.setPen(np); - painter.setPen(p); - painter.drawLine(QLineF(rect.left(), y, rect.right(), y)); -} - -QColor JKQTPXYFunctionLineGraph::getKeyLabelColor() const { - return getLineColor(); -} - - -void JKQTPXYFunctionLineGraph::createPlotData(bool collectParams) { -#ifdef JKQTBP_AUTOTIMER - JKQTPAutoOutputTimer jkaat(QString("JKQTPXYFunctionLineGraph[%1]::createPlotData()").arg(title)); -#endif - data.clear(); - if (collectParams) collectParameters(); - - if (parent==nullptr) return; - if (!plotFunction && !simplePlotFunction) return; - - jkqtpSimpleParametricCurveFunctionType func; - if (plotFunction) func=std::bind(plotFunction, std::placeholders::_1, getInternalParams()); - else if (simplePlotFunction) func=simplePlotFunction; - - jkqtpSimpleParametricCurveFunctionType fTransformedFunc= std::bind([&](const JKQTPPlotElement* plot, double t) -> QPointF { return plot->transform(func(t)); }, this, std::placeholders::_1); - - JKQTPAdaptiveFunctionGraphEvaluator evaluator(fTransformedFunc, minSamples, maxRefinementDegree, slopeTolerance, minPixelPerSample); - data=evaluator.evaluate(tmin, tmax); - data=JKQTPSimplyfyLineSegemnts(data, dataCleanupMaxAllowedAngleDegree); -} - - -void JKQTPXYFunctionLineGraph::draw(JKQTPEnhancedPainter& painter) { -#ifdef JKQTBP_AUTOTIMER - JKQTPAutoOutputTimer jkaaot("JKQTPXYFunctionLineGraph::draw"); -#endif - if (parent==nullptr) return; - JKQTPDatastore* datastore=parent->getDatastore(); - if (datastore==nullptr) return; - - //qDebug()<<"start plot\n"; - createPlotData(); - //qDebug()<<"plot data created\n"; - - drawErrorsBefore(painter); - { - painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); - - QPen p=getLinePen(painter, parent); - QPen np(Qt::NoPen); - - - { - painter.save(); auto __finalpaintline=JKQTPFinally([&painter]() {painter.restore();}); - painter.setPen(p); - painter.drawPolyline(data); - } - - - if (displaySamplePoints) drawSamplePoints(painter, getLineColor()); - } - drawErrorsAfter(painter); - //std::cout<<"plot done\n"; -} - - - -double JKQTPXYFunctionLineGraph::getTMin() const +bool JKQTPXYFunctionLineGraph::isSimplePlotFunction() const { - return tmin; + return !static_cast(plotFunction) && static_cast(simplePlotFunction); } -double JKQTPXYFunctionLineGraph::getTMax() const + +JKQTPEvaluatedFunctionGraphBase::PlotFunctorSpec JKQTPXYFunctionLineGraph::buildPlotFunctorSpec() { - return tmax; -} - -void JKQTPXYFunctionLineGraph::setTMin(double val) -{ - tmin=val; -} - -void JKQTPXYFunctionLineGraph::setTMax(double val) -{ - tmax=val; -} - -QPair JKQTPXYFunctionLineGraph::getTRange() const -{ - return QPair(tmin,tmax); -} - -void JKQTPXYFunctionLineGraph::setTRange(double tmin_, double tmax_) -{ - tmin=tmin_; - tmax=tmax_; -} - -void JKQTPXYFunctionLineGraph::setTRange(const QPair &range) -{ - tmin=range.first; - tmax=range.second; + JKQTPEvaluatedFunctionGraphBase::PlotFunctorSpec spec; + + if (!plotFunction && !simplePlotFunction) return spec; // return invalid spec! + + // range over which to evaluate func + spec.range_start=tmin; + spec.range_end=tmax; + + // the actual function to use + if (plotFunction) spec.func=std::bind(plotFunction, std::placeholders::_1, getInternalParams()); + else if (simplePlotFunction) spec.func=simplePlotFunction; + + return spec; } diff --git a/lib/jkqtplotter/graphs/jkqtpevaluatedparametriccurve.h b/lib/jkqtplotter/graphs/jkqtpevaluatedparametriccurve.h index 6835ead8de..3d25926907 100644 --- a/lib/jkqtplotter/graphs/jkqtpevaluatedparametriccurve.h +++ b/lib/jkqtplotter/graphs/jkqtpevaluatedparametriccurve.h @@ -33,62 +33,136 @@ #define jkqtpevaluatedparametriccurve_H +/** \brief Base class for line plots where the data is taken from a user supplied function \f$ [x,y]=f(t) \f$ + * The function is evaluated on a user-specified range \f$ t \in \left[t_\text{min}, t_\text{max}\right] \f$ + * \ingroup jkqtplotter_functiongraphs + * + * This class uses the intelligent plotting algorithm for functions, implemented in JKQTPAdaptiveFunctionGraphEvaluator. + * 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. + * + * Finally the obtained data is cleaned up to reduce the amount of points, by deleting a point, when it leads to an + * angle between consecutive line-segments of less than dataCleanupMaxAllowedAngleDegree. + * + * + * \see JKQTPXYFunctionLineGraphBase for a concrete implementation with C++-functors as functions + */ +class JKQTPLOTTER_LIB_EXPORT JKQTPXYFunctionLineGraphBase: public JKQTPEvaluatedFunctionGraphBase, public JKQTPGraphLineStyleMixin { + Q_OBJECT +public: + + /** \brief class constructor */ + JKQTPXYFunctionLineGraphBase(JKQTBasePlotter* parent=nullptr); + + /** \brief class constructor */ + JKQTPXYFunctionLineGraphBase(JKQTPlotter* parent); + + /** \brief class destructor */ + virtual ~JKQTPXYFunctionLineGraphBase() override; + + /** \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 */ + virtual QColor getKeyLabelColor() const override; -/*! \brief type of functions that may be plotted by JKQTPXYFunctionLineGraph - \ingroup jkqtplotter_functiongraphs + /** \brief returns the t-value range for \f$ [x,y]=f(t), t \in \left[t_\text{min}, t_\text{max}\right] \f$ */ + QPair getTRange() const; + /** \copydoc tmin */ + double getTMin() const; + /** \copydoc tmax */ + double getTMax() const; - This is the type of functions \f$ [x,y]=f(t, \vec{p}) \f$ that may be plottet by JKQTPXYFunctionLineGraph. - It is possible to supply parameters \f$ \vec{p} \f$ to the function that - 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. +public slots: + /** \copydoc tmin */ + void setTMin(double val); + /** \copydoc tmax */ + void setTMax(double val); + /** \brief set the t-value range for \f$ [x,y]=f(t), t \in \left[t_\text{min}, t_\text{max}\right] \f$ */ + void setTRange(double tmin_, double tmax_); + /** \brief set the t-value range for \f$ [x,y]=f(t), t \in \left[t_\text{min}, t_\text{max}\right] \f$ */ + void setTRange(const QPair& range); +protected: + + /** \brief lower bound of t-value range for \f$ [x,y]=f(t), t \in \left[t_\text{min}, t_\text{max}\right] \f$ , i.e. \f$ t_\text{min} \f$ , default is 0 + * + * \see getTMin(), getTMax(), setTMin(), setTMax(), setTRange(), getTRange() */ + double tmin; + /** \brief upper bound of t-value range for \f$ [x,y]=f(t), t \in \left[t_\text{min}, t_\text{max}\right] \f$ , i.e. \f$ t_\text{min} \f$ , default is 1 + * + * \see getTMin(), getTMax(), setTMin(), setTMax(), setTRange(), getTRange() */ + double tmax; + +}; + + + +/** \brief type of functions that may be plotted by JKQTPXYFunctionLineGraph + * \ingroup jkqtplotter_functiongraphs + * + * This is the type of functions \f$ [x,y]=f(t, \vec{p}) \f$ that may be plottet by JKQTPXYFunctionLineGraph. + * It is possible to supply parameters \f$ \vec{p} \f$ to the function that + * 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)> jkqtpParametricCurveFunctionType; -/*! \brief simplified type of functions (without parameters) that may be plotted by JKQTPXYFunctionLineGraph - \ingroup jkqtplotter_functiongraphs - - This is the type of functions \f$ [x,y]=f(t) \f$ that may be plottet by JKQTPXYFunctionLineGraph - and JKQTPYFunctionLineGraph. +/** \brief simplified type of functions (without parameters) that may be plotted by JKQTPXYFunctionLineGraph + * \ingroup jkqtplotter_functiongraphs + * + * This is the type of functions \f$ [x,y]=f(t) \f$ that may be plottet by JKQTPXYFunctionLineGraph + * and JKQTPYFunctionLineGraph. */ typedef std::function jkqtpSimpleParametricCurveFunctionType; -/*! \brief This implements line plots where the data is taken from a user supplied function \f$ [x,y]=f(t) \f$ - The function is evaluated on a user-specified range \f$ t \in \left[t_\text{min}, t_\text{max}\right] \f$ - \ingroup jkqtplotter_functiongraphs - - This class uses the intelligent plotting algorithm for functions, implemented in JKQTPAdaptiveFunctionGraphEvaluator. - 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. - - Finally the obtained data is cleaned up to reduce the amount of points, by deleting a point, when it leads to an - angle between consecutive line-segments of less than dataCleanupMaxAllowedAngleDegree. - - the following image shows a Lissajou's fugure drawn with this function - - \image html plot_evalcurve.png - - The source code for this example is: - \code - JKQTPXYFunctionLineGraph* func1=new JKQTPXYFunctionLineGraph(plot); - func1->setPlotFunctionFunctor([](double t) -> QPointF { - const double a=5; - const double b=4; - const double delta=JKQTPSTATISTICS_PI/4.0; - return QPointF(sin(a*t+delta), sin(b*t)); - }); - func1->setTRange(0, 2.0*JKQTPSTATISTICS_PI); - func1->setTitle("C++-inline function $[ sin(5{\\cdot}t+\\pi/4), sin(4{\\cdot}t) ]$"); - \endcode - - \see \ref JKQTPlotterEvalCurves , JKQTPAdaptiveFunctionGraphEvaluator, JKQTPXFunctionLineGraph, JKQTPYFunctionLineGraph +/** \brief This implements line plots where the data is taken from a user supplied function \f$ [x,y]=f(t) \f$ + * The function is evaluated on a user-specified range \f$ t \in \left[t_\text{min}, t_\text{max}\right] \f$ + * \ingroup jkqtplotter_functiongraphs + * + * \see JKQTPXYFunctionLineGraphBase for details on the used plotting algorithm + * + * The following image shows a Lissajou's fugure drawn with this function + * + * \image html plot_evalcurve.png + * + * The source code for this example is: + * \code + * JKQTPXYFunctionLineGraph* func1=new JKQTPXYFunctionLineGraph(plot); + * // here we define the C++-functor for [x,y]=f(t) + * func1->setPlotFunctionFunctor([](double t) -> QPointF { + * const double a=5; + * const double b=4; + * const double delta=JKQTPSTATISTICS_PI/4.0; + * return QPointF(sin(a*t+delta), sin(b*t)); + * }); + * // and define the range over which to evaluate + * func1->setTRange(0, 2.0*JKQTPSTATISTICS_PI); + * \endcode + * + * The source code for the same example, but using functions that also get a parameter vector: + * \code + * JKQTPXYFunctionLineGraph* func1=new JKQTPXYFunctionLineGraph(plot); + * // here we define the C++-functor for [x,y]=f(t) + * func1->setPlotFunctionFunctor([](double t, const QVector& params) -> QPointF { + * return QPointF(3.0*sin(params[0]*t+params[2])+8.0, 3.0*sin(params[1]*t)); + * }); + * // now we define the 3 parameters of the function + * // parameters are a, b, delta, as in the example above (in that order) + * func1->setParamsV(5, 4, JKQTPSTATISTICS_PI/4.0); + * // and define the range over which to evaluate + * func1->setTRange(0, 2.0*JKQTPSTATISTICS_PI); + * \endcode + * + * \see \ref JKQTPlotterEvalCurves , JKQTPAdaptiveFunctionGraphEvaluator, JKQTPXFunctionLineGraph, JKQTPYFunctionLineGraph */ -class JKQTPLOTTER_LIB_EXPORT JKQTPXYFunctionLineGraph: public JKQTPEvaluatedFunctionWithParamsGraphBase, public JKQTPGraphLineStyleMixin { +class JKQTPLOTTER_LIB_EXPORT JKQTPXYFunctionLineGraph: public JKQTPXYFunctionLineGraphBase { Q_OBJECT public: @@ -117,60 +191,44 @@ class JKQTPLOTTER_LIB_EXPORT JKQTPXYFunctionLineGraph: public JKQTPEvaluatedFunc /** \brief class destructor */ virtual ~JKQTPXYFunctionLineGraph() override; - /** \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 */ - virtual QColor getKeyLabelColor() const override; /** \brief sets a functor to be plotted * * \see plotFunction */ - virtual void setPlotFunctionFunctor (jkqtpParametricCurveFunctionType && __value); + void setPlotFunctionFunctor (jkqtpParametricCurveFunctionType && __value); /** \brief sets a functor to be plotted * * \see plotFunction */ - virtual void setPlotFunctionFunctor (const jkqtpParametricCurveFunctionType & __value); + void setPlotFunctionFunctor (const jkqtpParametricCurveFunctionType & __value); /** \brief sets a functor to be plotted * * \see simplePlotFunction */ - virtual void setPlotFunctionFunctor (jkqtpSimpleParametricCurveFunctionType && __value); + void setPlotFunctionFunctor (jkqtpSimpleParametricCurveFunctionType && __value); /** \brief sets a functor to be plotted * * \see simplePlotFunction */ - virtual void setPlotFunctionFunctor (const jkqtpSimpleParametricCurveFunctionType & __value); - /*! \copydoc plotFunction */ \ - virtual jkqtpParametricCurveFunctionType getPlotFunctionFunctor () const; - /*! \copydoc simplePlotFunction */ \ - virtual jkqtpSimpleParametricCurveFunctionType getSimplePlotFunction () const; + void setPlotFunctionFunctor (const jkqtpSimpleParametricCurveFunctionType & __value); + /** \copydoc plotFunction + * + * \see isSimplePlotFunction() */ + jkqtpParametricCurveFunctionType getPlotFunctionFunctor () const; + /** \copydoc simplePlotFunction + * + * \see isSimplePlotFunction() */ + jkqtpSimpleParametricCurveFunctionType getSimplePlotFunction () const; + + /** \brief returns whether the plot function was defined as a jkqtpSimpleParametricCurveFunctionType (\c true ) or + * a jkqtpParametricCurveFunctionType (\c false ) */ + bool isSimplePlotFunction() const; - /*! \copydoc tmin */ - double getTMin() const; - /*! \copydoc tmax */ - double getTMax() const; - /*! \copydoc tmin */ - void setTMin(double val); - /*! \copydoc tmax */ - void setTMax(double val); - /*! \brief returns the t-value range for \f$ [x,y]=f(t), t \in \left[t_\text{min}, t_\text{max}\right] \f$ */ - QPair getTRange() const; - /*! \brief set the t-value range for \f$ [x,y]=f(t), t \in \left[t_\text{min}, t_\text{max}\right] \f$ */ - void setTRange(double tmin_, double tmax_); - /*! \brief set the t-value range for \f$ [x,y]=f(t), t \in \left[t_\text{min}, t_\text{max}\right] \f$ */ - void setTRange(const QPair& range); protected: - /** \brief lower bound of t-value range for \f$ [x,y]=f(t), t \in \left[t_\text{min}, t_\text{max}\right] \f$ , i.e. \f$ t_\text{min} \f$ , default is 0 */ - double tmin; - /** \brief upper bound of t-value range for \f$ [x,y]=f(t), t \in \left[t_\text{min}, t_\text{max}\right] \f$ , i.e. \f$ t_\text{min} \f$ , default is 1 */ - double tmax; - /** \brief fill the data array with data from the function plotFunction */ - virtual void createPlotData( bool collectParams=true) override; + /** \copydoc JKQTPEvaluatedFunctionGraphBase::buildPlotFunctorSpec() */ + virtual PlotFunctorSpec buildPlotFunctorSpec() override; /** \brief the function to be plotted */ diff --git a/lib/jkqtplotter/graphs/jkqtpparsedfunction.cpp b/lib/jkqtplotter/graphs/jkqtpparsedfunction.cpp index 86dd7e8870..df12d830b5 100644 --- a/lib/jkqtplotter/graphs/jkqtpparsedfunction.cpp +++ b/lib/jkqtplotter/graphs/jkqtpparsedfunction.cpp @@ -27,131 +27,73 @@ #include #include - -JKQTPXParsedFunctionLineGraph::JKQTPXParsedFunctionLineGraph(JKQTBasePlotter *parent): - JKQTPXFunctionLineGraph(parent) +JKQTPParsedFunctionLineGraphBase::JKQTPParsedFunctionLineGraphBase(const QString& dependentVariableName_, const QString& function_, JKQTBasePlotter *parent): + JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase(parent), + dependentVariableName(dependentVariableName_), + function(function_) { - fdata.parser=new JKQTPMathParser(); + fdata.parser=std::make_shared(); fdata.node=nullptr; fdata.varcount=0; - function=""; - parameterColumn=-1; - setPlotFunctionFunctor(jkqtpPlotFunctionType(std::bind(&JKQTPXParsedFunctionLineGraph::JKQTPXParsedFunctionLineGraphFunction, std::placeholders::_1, std::placeholders::_2, &fdata))); - efdata.parser=new JKQTPMathParser(); + + efdata.parser=std::make_shared(); efdata.node=nullptr; efdata.varcount=0; - errorFunction=""; - errorParameterColumn=-1; - setErrorPlotFunction(jkqtpPlotFunctionType(std::bind(&JKQTPXParsedFunctionLineGraph::JKQTPXParsedFunctionLineGraphFunction, std::placeholders::_1, std::placeholders::_2, &efdata))); } -JKQTPXParsedFunctionLineGraph::JKQTPXParsedFunctionLineGraph(JKQTPlotter *parent): - JKQTPXParsedFunctionLineGraph(parent->getPlotter()) +JKQTPParsedFunctionLineGraphBase::JKQTPParsedFunctionLineGraphBase(const QString& dependentVariableName, const QString& function, JKQTPlotter *parent): + JKQTPParsedFunctionLineGraphBase(dependentVariableName, function, parent->getPlotter()) { } -JKQTPXParsedFunctionLineGraph::~JKQTPXParsedFunctionLineGraph() +JKQTPParsedFunctionLineGraphBase::JKQTPParsedFunctionLineGraphBase(const QString& dependentVariableName, JKQTBasePlotter *parent): + JKQTPParsedFunctionLineGraphBase(dependentVariableName, QString(), parent) { - if (fdata.node) delete fdata.node; - delete fdata.parser; - if (efdata.node) delete efdata.node; - delete efdata.parser; } -void JKQTPXParsedFunctionLineGraph::setFunction(const QString &__value) +JKQTPParsedFunctionLineGraphBase::JKQTPParsedFunctionLineGraphBase(const QString& dependentVariableName, JKQTPlotter *parent): + JKQTPParsedFunctionLineGraphBase(dependentVariableName, QString(), parent) +{ +} + + +JKQTPParsedFunctionLineGraphBase::~JKQTPParsedFunctionLineGraphBase() +{ +} + +void JKQTPParsedFunctionLineGraphBase::setFunction(const QString &__value) { this->function = __value; } -QString JKQTPXParsedFunctionLineGraph::getFunction() const +QString JKQTPParsedFunctionLineGraphBase::getFunction() const { return this->function; } -void JKQTPXParsedFunctionLineGraph::setErrorFunction(const QString &__value) +void JKQTPParsedFunctionLineGraphBase::setErrorFunction(const QString &__value) { this->errorFunction = __value; } -QString JKQTPXParsedFunctionLineGraph::getErrorFunction() const +QString JKQTPParsedFunctionLineGraphBase::getErrorFunction() const { return this->errorFunction; } -void JKQTPXParsedFunctionLineGraph::createPlotData(bool /*collectParams*/) +QString JKQTPParsedFunctionLineGraphBase::getDependentVariableName() const { - collectParameters(); - - //QElapsedTimer timer; - //timer.start(); - for (int i=0; ideleteVariable(std::string("p")+jkqtp_inttostr(i+1)); - } - fdata.varcount=0; - try { - for (const auto& p: getInternalParams()) { - fdata.parser->addVariableDouble(std::string("p")+jkqtp_inttostr(fdata.varcount+1), p); - fdata.varcount=fdata.varcount+1; - } - fdata.parser->addVariableDouble(std::string("x"), 0.0); - if (fdata.node) delete fdata.node; - //qint64 t=timer.elapsed(); - - - //qDebug()<<"createPlotData(): adding variables: "<parse(function.toStdString()); - //qDebug()<<"createPlotData(): parsing: "<deleteVariable(std::string("p")+jkqtp_inttostr(i+1)); - } - efdata.varcount=0; - try { - QVector* errorParameters=static_cast*>(errorParams); - if (errorParameters) { - for (int i=0; isize(); i++) { - efdata.parser->addVariableDouble(std::string("p")+jkqtp_inttostr(efdata.varcount+1), errorParameters->at(i)); - efdata.varcount=efdata.varcount+1; - } - } - efdata.parser->addVariableDouble(std::string("x"), 0.0); - if (efdata.node) delete efdata.node; - //qint64 t=timer.elapsed(); - //qDebug()<<"createPlotData(): adding variables: "<parse(errorFunction.toStdString()); - //qDebug()<<"createPlotData(): parsing: "<next; - } - qDebug()<<"refined to "<& /*data*/, JKQTPXParsedFunctionLineGraphFunctionData *fdata) { - JKQTPXParsedFunctionLineGraph::JKQTPXParsedFunctionLineGraphFunctionData* d=fdata;//static_cast(data); +double JKQTPParsedFunctionLineGraphBase::evaluateParsedFunction(double t, ParsedFunctionLineGraphFunctionData *fdata) { + JKQTPParsedFunctionLineGraphBase::ParsedFunctionLineGraphFunctionData* d=fdata;//static_cast(data); if (d && d->parser && d->node) { try { - d->parser->addVariableDouble("x", x); + d->parser->addVariableDouble(d->dependentVariableName.toStdString(), t); JKQTPMathParser::jkmpResult r=d->node->evaluate(); if (r.isValid) { @@ -162,8 +104,8 @@ double JKQTPXParsedFunctionLineGraph::JKQTPXParsedFunctionLineGraphFunction(doub } } } catch(std::exception& E) { - qDebug()<getExpression()).arg(E.what()).arg(row).arg(column), QMessageBox::Ok|QMessageBox::Cancel, QMessageBox::Ok)==QMessageBox::Ok;*/ @@ -186,79 +128,152 @@ double JKQTPXParsedFunctionLineGraph::JKQTPXParsedFunctionLineGraphFunction(doub + + +JKQTPXParsedFunctionLineGraph::JKQTPXParsedFunctionLineGraph(JKQTBasePlotter *parent): + JKQTPParsedFunctionLineGraphBase(QString("x"), parent) +{ +} + +JKQTPXParsedFunctionLineGraph::JKQTPXParsedFunctionLineGraph(JKQTPlotter *parent): + JKQTPParsedFunctionLineGraphBase(QString("x"), parent) +{ +} + +JKQTPXParsedFunctionLineGraph::JKQTPXParsedFunctionLineGraph(const QString& function, JKQTBasePlotter *parent): + JKQTPParsedFunctionLineGraphBase(QString("x"), function, parent) +{ +} + +JKQTPXParsedFunctionLineGraph::JKQTPXParsedFunctionLineGraph(const QString& function, JKQTPlotter *parent): + JKQTPParsedFunctionLineGraphBase(QString("x"), function, parent) +{ +} + +JKQTPXParsedFunctionLineGraph::~JKQTPXParsedFunctionLineGraph() +{ +} + +void JKQTPXParsedFunctionLineGraph::draw(JKQTPEnhancedPainter &painter) +{ + drawXGraph(painter); +} + + +JKQTPEvaluatedFunctionGraphBase::PlotFunctorSpec JKQTPXParsedFunctionLineGraph::buildPlotFunctorSpec() +{ + JKQTPEvaluatedFunctionGraphBase::PlotFunctorSpec spec; + + if (parent==nullptr) return spec; // return an invalid PlotFunctorSpec + + for (int i=0; ideleteVariable(std::string("p")+jkqtp_inttostr(i+1)); + } + fdata.varcount=0; + try { + for (const auto& p: getInternalParams()) { + fdata.parser->addVariableDouble(std::string("p")+jkqtp_inttostr(fdata.varcount+1), p); + fdata.varcount=fdata.varcount+1; + } + fdata.dependentVariableName=getDependentVariableName(); + fdata.parser->addVariableDouble(getDependentVariableName().toStdString(), 0.0); + fdata.node=std::shared_ptr(fdata.parser->parse(function.toStdString())); + } catch(std::exception& E) { + qDebug()< QPointF { return QPointF(0, plotFunction(x)); }, std::placeholders::_1); + + return spec; +} + +std::function JKQTPXParsedFunctionLineGraph::buildErrorFunctorSpec() +{ + std::function spec; + + for (int i=0; ideleteVariable(std::string("p")+jkqtp_inttostr(i+1)); + } + efdata.varcount=0; + try { + for (const auto& p: getInternalErrorParams()) { + efdata.parser->addVariableDouble(std::string("p")+jkqtp_inttostr(efdata.varcount+1), p); + efdata.varcount=efdata.varcount+1; + } + efdata.dependentVariableName=getDependentVariableName(); + efdata.parser->addVariableDouble(getDependentVariableName().toStdString(), 0.0); + efdata.node=std::shared_ptr(efdata.parser->parse(errorFunction.toStdString())); + } catch(std::exception& /*E*/) { + //qDebug()< QPointF { return QPointF(0, errorPlotFunction(x)); }, std::placeholders::_1); + + return spec; +} + + + + + + + + + + + + + + + + + + + + JKQTPYParsedFunctionLineGraph::JKQTPYParsedFunctionLineGraph(JKQTBasePlotter *parent): - JKQTPYFunctionLineGraph(parent) + JKQTPParsedFunctionLineGraphBase(QString("y"), parent) { - fdata.parser=new JKQTPMathParser(); - fdata.node=nullptr; - fdata.varcount=0; - function=""; - parameterColumn=-1; - setPlotFunctionFunctor(jkqtpPlotFunctionType(std::bind(&JKQTPYParsedFunctionLineGraph::JKQTPYParsedFunctionLineGraphFunction, std::placeholders::_1, std::placeholders::_2, &fdata))); - - efdata.parser=new JKQTPMathParser(); - efdata.node=nullptr; - efdata.varcount=0; - errorFunction=""; - errorParameterColumn=-1; - setErrorPlotFunction(jkqtpPlotFunctionType(std::bind(&JKQTPYParsedFunctionLineGraph::JKQTPYParsedFunctionLineGraphFunction, std::placeholders::_1, std::placeholders::_2, &efdata))); } JKQTPYParsedFunctionLineGraph::JKQTPYParsedFunctionLineGraph(JKQTPlotter *parent): - JKQTPYFunctionLineGraph(parent) + JKQTPParsedFunctionLineGraphBase(QString("y"), parent) { - fdata.parser=new JKQTPMathParser(); - fdata.node=nullptr; - fdata.varcount=0; - function=""; - parameterColumn=-1; - setPlotFunctionFunctor(jkqtpPlotFunctionType(std::bind(&JKQTPYParsedFunctionLineGraph::JKQTPYParsedFunctionLineGraphFunction, std::placeholders::_1, std::placeholders::_2, &fdata))); +} - efdata.parser=new JKQTPMathParser(); - efdata.node=nullptr; - efdata.varcount=0; - errorFunction=""; - errorParameterColumn=-1; - setErrorPlotFunction(jkqtpPlotFunctionType(std::bind(&JKQTPYParsedFunctionLineGraph::JKQTPYParsedFunctionLineGraphFunction, std::placeholders::_1, std::placeholders::_2, &efdata))); +JKQTPYParsedFunctionLineGraph::JKQTPYParsedFunctionLineGraph(const QString& function, JKQTBasePlotter *parent): + JKQTPParsedFunctionLineGraphBase(QString("y"), function, parent) +{ +} + +JKQTPYParsedFunctionLineGraph::JKQTPYParsedFunctionLineGraph(const QString& function, JKQTPlotter *parent): + JKQTPParsedFunctionLineGraphBase(QString("y"), function, parent) +{ } JKQTPYParsedFunctionLineGraph::~JKQTPYParsedFunctionLineGraph() { - if (fdata.node) delete fdata.node; - delete fdata.parser; - if (efdata.node) delete efdata.node; - delete efdata.parser; } -void JKQTPYParsedFunctionLineGraph::setFunction(const QString &__value) +void JKQTPYParsedFunctionLineGraph::draw(JKQTPEnhancedPainter &painter) { - this->function = __value; + drawYGraph(painter); } -QString JKQTPYParsedFunctionLineGraph::getFunction() const -{ - return this->function; -} -void JKQTPYParsedFunctionLineGraph::setErrorFunction(const QString &__value) +JKQTPEvaluatedFunctionGraphBase::PlotFunctorSpec JKQTPYParsedFunctionLineGraph::buildPlotFunctorSpec() { - this->errorFunction = __value; -} + JKQTPEvaluatedFunctionGraphBase::PlotFunctorSpec spec; -QString JKQTPYParsedFunctionLineGraph::getErrorFunction() const -{ - return this->errorFunction; -} + if (parent==nullptr) return spec; // return an invalid PlotFunctorSpec -void JKQTPYParsedFunctionLineGraph::createPlotData(bool /*collectParams*/) -{ - collectParameters(); - - //QElapsedTimer timer; - //timer.start(); for (int i=0; ideleteVariable(std::string("p")+jkqtp_inttostr(i+1)); } @@ -268,82 +283,47 @@ void JKQTPYParsedFunctionLineGraph::createPlotData(bool /*collectParams*/) fdata.parser->addVariableDouble(std::string("p")+jkqtp_inttostr(fdata.varcount+1), p); fdata.varcount=fdata.varcount+1; } - fdata.parser->addVariableDouble(std::string("x"), 0.0); - fdata.parser->addVariableDouble(std::string("y"), 0.0); - if (fdata.node) delete fdata.node; - //qint64 t=timer.elapsed(); - - - //qDebug()<<"createPlotData(): adding variables: "<parse(function.toStdString()); - //qDebug()<<"createPlotData(): parsing: "<addVariableDouble(getDependentVariableName().toStdString(), 0.0); + fdata.node=std::shared_ptr(fdata.parser->parse(function.toStdString())); } catch(std::exception& E) { qDebug()< QPointF { return QPointF(plotFunction(y), 0); }, std::placeholders::_1); + + // range over which to evaluate func + spec.range_start=parent->getXMin(); + spec.range_end=parent->getXMax(); + + return spec; +} + +std::function JKQTPYParsedFunctionLineGraph::buildErrorFunctorSpec() +{ + std::function spec; + for (int i=0; ideleteVariable(std::string("p")+jkqtp_inttostr(i+1)); } efdata.varcount=0; try { - QVector* errorParameters=static_cast*>(errorParams); - if (errorParameters) { - for (int i=0; isize(); i++) { - efdata.parser->addVariableDouble(std::string("p")+jkqtp_inttostr(efdata.varcount+1), errorParameters->at(i)); - efdata.varcount=efdata.varcount+1; - } + for (const auto& p: getInternalErrorParams()) { + efdata.parser->addVariableDouble(std::string("p")+jkqtp_inttostr(efdata.varcount+1), p); + efdata.varcount=efdata.varcount+1; } - efdata.parser->addVariableDouble(std::string("x"), 0.0); - efdata.parser->addVariableDouble(std::string("y"), 0.0); - if (efdata.node) delete efdata.node; - //qint64 t=timer.elapsed(); - //qDebug()<<"createPlotData(): adding variables: "<parse(errorFunction.toStdString()); - //qDebug()<<"createPlotData(): parsing: "<addVariableDouble(getDependentVariableName().toStdString(), 0.0); + efdata.node=std::shared_ptr(efdata.parser->parse(errorFunction.toStdString())); + } catch(std::exception& /*E*/) { + //qDebug()<next; - } - qDebug()<<"refined to "< & /*data*/, JKQTPYParsedFunctionLineGraphFunctionData *fdata) { - JKQTPYParsedFunctionLineGraph::JKQTPYParsedFunctionLineGraphFunctionData* d=fdata;//static_cast(data); - if (d && d->parser && d->node) { - try { - d->parser->addVariableDouble("x", x); - d->parser->addVariableDouble("y", x); - JKQTPMathParser::jkmpResult r=d->node->evaluate(); - - if (r.isValid) { - if (r.type==JKQTPMathParser::jkmpBool) { - return r.boolean?1.0:0.0; - } else if (r.type==JKQTPMathParser::jkmpDouble) { - return r.num; - } - } - } catch(std::exception& /*E*/) { - //qDebug()<getExpression()).arg(E.what()).arg(row).arg(column), - QMessageBox::Ok|QMessageBox::Cancel, QMessageBox::Ok)==QMessageBox::Ok;*/ - - } - } - return NAN; + jkqtpSimplePlotFunctionType errorPlotFunction=std::bind(&JKQTPXParsedFunctionLineGraph::evaluateParsedFunction, std::placeholders::_1, &efdata); + // the actual function to use + spec=std::bind([=](double y) -> QPointF { return QPointF(errorPlotFunction(y), 0); }, std::placeholders::_1); + return spec; } diff --git a/lib/jkqtplotter/graphs/jkqtpparsedfunction.h b/lib/jkqtplotter/graphs/jkqtpparsedfunction.h index 9f0b6608a2..86b5a93ec0 100644 --- a/lib/jkqtplotter/graphs/jkqtpparsedfunction.h +++ b/lib/jkqtplotter/graphs/jkqtpparsedfunction.h @@ -34,6 +34,74 @@ class JKQTBasePlotter; class JKQTPlotter; +/** \brief extends JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase with the capabilities to define functions from strings + * that are parsed by JKQTPMathParser + * \ingroup jkqtplotter_functiongraphs + * + * \see JKQTPXParsedFunctionLineGraph and JKQTPYParsedFunctionLineGraph for a concrete implementation, see also JKQTPMathParser + */ +class JKQTPLOTTER_LIB_EXPORT JKQTPParsedFunctionLineGraphBase: public JKQTPEvaluatedFunctionWithErrorsGraphDrawingBase { + Q_OBJECT +public: + + + /** \brief class constructor */ + JKQTPParsedFunctionLineGraphBase(const QString& dependentVariableName, JKQTBasePlotter* parent=nullptr); + /** \brief class constructor */ + JKQTPParsedFunctionLineGraphBase(const QString& dependentVariableName, JKQTPlotter* parent); + + /** \brief class constructor */ + JKQTPParsedFunctionLineGraphBase(const QString& dependentVariableName, const QString& function, JKQTBasePlotter* parent=nullptr); + /** \brief class constructor */ + JKQTPParsedFunctionLineGraphBase(const QString& dependentVariableName, const QString& function, JKQTPlotter* parent); + + + /** \brief class destructor */ + virtual ~JKQTPParsedFunctionLineGraphBase() override; + + /** \copydoc function */ + QString getFunction() const; + + /** \copydoc errorFunction */ + QString getErrorFunction() const; + /** \copydoc dependentVariableName */ + QString getDependentVariableName() const; + +public slots: + /** \copydoc errorFunction */ + void setErrorFunction(const QString & __value); + /** \copydoc function */ + void setFunction(const QString & __value); + +protected: + + /** \brief INTERNAL data structure combining a JKQTPMathParser and a JKQTPMathParser::jkmpNode + */ + struct ParsedFunctionLineGraphFunctionData { + std::shared_ptr parser; + std::shared_ptr node; + int varcount; + QString dependentVariableName; + }; + + /** \brief nache of the dependent variable (e.g. x for a function f(x) ) */ + QString dependentVariableName; + + /** \brief the function to be evaluated for the plot. Use \c x as the free variable, e.g. \c "x^2+2" */ + QString function; + /** \brief parser data structure for function */ + ParsedFunctionLineGraphFunctionData fdata; + + /** \brief the function to be evaluated to add error indicators to the graph. This function is evaluated to an error for every x. Use \c x as the free variable, e.g. \c "x^2+2". */ + QString errorFunction; + /** \brief parser data structure for errorFunction */ + ParsedFunctionLineGraphFunctionData efdata; + + /** \brief implements the actual plot function */ + static double evaluateParsedFunction(double x, ParsedFunctionLineGraphFunctionData* fdata) ; +}; + + /*! \brief This implements line plots where the data is taken from a user supplied function \f$ y=f(x) \f$ The function is defined as a string and parsed by JKMathParser \ingroup jkqtplotter_parsedFgraphs @@ -45,7 +113,7 @@ class JKQTPlotter; \see \ref JKQTPlotterParsedFunctionPlot, JKQTPMathParser */ -class JKQTPLOTTER_LIB_EXPORT JKQTPXParsedFunctionLineGraph: public JKQTPXFunctionLineGraph { +class JKQTPLOTTER_LIB_EXPORT JKQTPXParsedFunctionLineGraph: public JKQTPParsedFunctionLineGraphBase { Q_OBJECT public: @@ -55,49 +123,26 @@ class JKQTPLOTTER_LIB_EXPORT JKQTPXParsedFunctionLineGraph: public JKQTPXFunctio /** \brief class constructor */ JKQTPXParsedFunctionLineGraph(JKQTPlotter* parent); + /** \brief class constructor */ + JKQTPXParsedFunctionLineGraph(const QString& function, JKQTBasePlotter* parent=nullptr); + /** \brief class constructor */ + JKQTPXParsedFunctionLineGraph(const QString& function, JKQTPlotter* parent); + /** \brief class destructor */ virtual ~JKQTPXParsedFunctionLineGraph() override; - /*! \copydoc function */ - void setFunction(const QString & __value); - /*! \copydoc function */ - QString getFunction() const; - - /*! \copydoc errorFunction */ - void setErrorFunction(const QString & __value); - /*! \copydoc errorFunction */ - QString getErrorFunction() const; - - /** \brief INTERNAL data structure - * \internal - */ - struct JKQTPXParsedFunctionLineGraphFunctionData { - JKQTPMathParser* parser; - JKQTPMathParser::jkmpNode* node; - int varcount; - }; + /** \brief plots the graph to the plotter object specified as parent */ + virtual void draw(JKQTPEnhancedPainter& painter) override; protected: - /** \brief the function to be evaluated for the plot. Use \c x as the free variable, e.g. \c "x^2+2" */ - QString function; - JKQTPXParsedFunctionLineGraphFunctionData fdata; - /** \brief the function to be evaluated to add error indicators to the graph. This function is evaluated to an error for every x. Use \c x as the free variable, e.g. \c "x^2+2". */ - QString errorFunction; - JKQTPXParsedFunctionLineGraphFunctionData efdata; - // hide functions that should not be used in this class! - using JKQTPXFunctionLineGraph::setPlotFunctionFunctor; - using JKQTPXFunctionLineGraph::setParams; - using JKQTPXFunctionLineGraph::setErrorPlotFunction; - using JKQTPXFunctionLineGraph::setErrorParams; + /** \copydoc JKQTPEvaluatedFunctionGraphBase::buildPlotFunctorSpec() */ + virtual PlotFunctorSpec buildPlotFunctorSpec() override; - /** \brief fill the data array with data from the function plotFunction */ - virtual void createPlotData(bool collectParams=true) override; - - /** \brief implements the actual plot function */ - static double JKQTPXParsedFunctionLineGraphFunction(double x, const QVector &data, JKQTPXParsedFunctionLineGraphFunctionData* fdata) ; + /** \copydoc JKQTPEvaluatedFunctionWithErrorsGraphBase::buildPlotFunctorSpec() */ + virtual std::function buildErrorFunctorSpec() override; }; @@ -114,7 +159,7 @@ class JKQTPLOTTER_LIB_EXPORT JKQTPXParsedFunctionLineGraph: public JKQTPXFunctio \see \ref JKQTPlotterParsedFunctionPlot, JKQTPMathParser */ -class JKQTPLOTTER_LIB_EXPORT JKQTPYParsedFunctionLineGraph: public JKQTPYFunctionLineGraph { +class JKQTPLOTTER_LIB_EXPORT JKQTPYParsedFunctionLineGraph: public JKQTPParsedFunctionLineGraphBase { Q_OBJECT public: @@ -124,47 +169,25 @@ class JKQTPLOTTER_LIB_EXPORT JKQTPYParsedFunctionLineGraph: public JKQTPYFunctio /** \brief class constructor */ JKQTPYParsedFunctionLineGraph(JKQTPlotter* parent); + /** \brief class constructor */ + JKQTPYParsedFunctionLineGraph(const QString& function, JKQTBasePlotter* parent=nullptr); + /** \brief class constructor */ + JKQTPYParsedFunctionLineGraph(const QString& function, JKQTPlotter* parent); + /** \brief class destructor */ virtual ~JKQTPYParsedFunctionLineGraph() override; - /*! \copydoc function */ - void setFunction(const QString & __value); - /*! \copydoc function */ - QString getFunction() const; + /** \brief plots the graph to the plotter object specified as parent */ + virtual void draw(JKQTPEnhancedPainter& painter) override; - /*! \copydoc errorFunction */ - void setErrorFunction(const QString & __value); - /*! \copydoc errorFunction */ - QString getErrorFunction() const; - - /** \brief INTERNAL data structure - * \internal - */ - struct JKQTPYParsedFunctionLineGraphFunctionData { - JKQTPMathParser* parser; - JKQTPMathParser::jkmpNode* node; - int varcount; - }; protected: - /** \brief the function to be evaluated for the plot. Use \c x as the free variable, e.g. \c "x^2+2" */ - QString function; - JKQTPYParsedFunctionLineGraphFunctionData fdata; - /** \brief the function to be evaluated to add error indicators to the graph. This function is evaluated to an error for every x. Use \c x as the free variable, e.g. \c "x^2+2". */ - QString errorFunction; - JKQTPYParsedFunctionLineGraphFunctionData efdata; + /** \copydoc JKQTPEvaluatedFunctionGraphBase::buildPlotFunctorSpec() */ + virtual PlotFunctorSpec buildPlotFunctorSpec() override; - // hide functions that should not be used in this class! - using JKQTPXFunctionLineGraph::setPlotFunctionFunctor; - using JKQTPXFunctionLineGraph::setParams; - using JKQTPXFunctionLineGraph::setErrorPlotFunction; - using JKQTPXFunctionLineGraph::setErrorParams; - - /** \brief fill the data array with data from the function plotFunction */ - virtual void createPlotData(bool collectParams=true) override; - /** \brief implements the actual plot function */ - static double JKQTPYParsedFunctionLineGraphFunction(double x, const QVector& data, JKQTPYParsedFunctionLineGraphFunctionData* fdata); + /** \copydoc JKQTPEvaluatedFunctionWithErrorsGraphBase::buildPlotFunctorSpec() */ + virtual std::function buildErrorFunctorSpec() override; }; #endif // jkqtpgraphsparsedfunction_H diff --git a/screenshots/evalcurve.png b/screenshots/evalcurve.png index f44cd00696d2b4c6fc599310008afc564f326be1..08ceef17a0bd63c6abe02ccc4d81591168de6a9e 100644 GIT binary patch literal 130266 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 z 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 BIEDZK literal 54127 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

    H;@!@x@F2K9<~Pt30ZEQ|R9Kt5%sj{A;cG#u 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 delta 19340 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