From 4ac14ed8712631ab0f9756b308418ae69992624c Mon Sep 17 00:00:00 2001 From: "Jan W. Krieger" Date: Sun, 23 Dec 2018 20:27:24 +0100 Subject: [PATCH] improved parsed/evaluated function classes (made C++11-ready) and added examples for them --- JKQtPlotterBuildAllExamples.pro | 2 + README.md | 2 + lib/jkqtplotter.pri | 4 +- ...n.cpp => jkqtpgraphsevaluatedfunction.cpp} | 1663 +++++++++-------- ...ction.h => jkqtpgraphsevaluatedfunction.h} | 607 +++--- lib/jkqtplotter/jkqtpgraphsparsedfunction.cpp | 12 +- lib/jkqtplotter/jkqtpgraphsparsedfunction.h | 32 +- lib/jkqtplottertools/jkqtpmathparser.cpp | 2 + .../jkqtplotter_simpletest_functionplot.png | Bin 0 -> 90967 bytes ...tplotter_simpletest_functionplot_small.png | Bin 0 -> 23585 bytes ...tplotter_simpletest_parsedfunctionplot.png | Bin 0 -> 37281 bytes ...r_simpletest_parsedfunctionplot_2overx.png | Bin 0 -> 20416 bytes ...er_simpletest_parsedfunctionplot_small.cpt | Bin 0 -> 23521 bytes ...er_simpletest_parsedfunctionplot_small.png | Bin 0 -> 15178 bytes test/simpletest_functionplot/README.md | 96 + .../jkqtplotter_simpletest_functionplot.cpp | 105 ++ .../jkqtplotter_simpletest_functionplot.pro | 23 + ...lotter_simpletest_functionplot_and_lib.pro | 8 + test/simpletest_parsedfunctionplot/README.md | 53 + ...tplotter_simpletest_parsedfunctionplot.cpp | 54 + ...tplotter_simpletest_parsedfunctionplot.pro | 23 + ..._simpletest_parsedfunctionplot_and_lib.pro | 8 + 22 files changed, 1568 insertions(+), 1126 deletions(-) rename lib/jkqtplotter/{jkqtpgraphsvaluatedfunction.cpp => jkqtpgraphsevaluatedfunction.cpp} (92%) rename lib/jkqtplotter/{jkqtpgraphsvaluatedfunction.h => jkqtpgraphsevaluatedfunction.h} (85%) create mode 100644 screenshots/jkqtplotter_simpletest_functionplot.png create mode 100644 screenshots/jkqtplotter_simpletest_functionplot_small.png create mode 100644 screenshots/jkqtplotter_simpletest_parsedfunctionplot.png create mode 100644 screenshots/jkqtplotter_simpletest_parsedfunctionplot_2overx.png create mode 100644 screenshots/jkqtplotter_simpletest_parsedfunctionplot_small.cpt create mode 100644 screenshots/jkqtplotter_simpletest_parsedfunctionplot_small.png create mode 100644 test/simpletest_functionplot/README.md create mode 100644 test/simpletest_functionplot/jkqtplotter_simpletest_functionplot.cpp create mode 100644 test/simpletest_functionplot/jkqtplotter_simpletest_functionplot.pro create mode 100644 test/simpletest_functionplot/jkqtplotter_simpletest_functionplot_and_lib.pro create mode 100644 test/simpletest_parsedfunctionplot/README.md create mode 100644 test/simpletest_parsedfunctionplot/jkqtplotter_simpletest_parsedfunctionplot.cpp create mode 100644 test/simpletest_parsedfunctionplot/jkqtplotter_simpletest_parsedfunctionplot.pro create mode 100644 test/simpletest_parsedfunctionplot/jkqtplotter_simpletest_parsedfunctionplot_and_lib.pro diff --git a/JKQtPlotterBuildAllExamples.pro b/JKQtPlotterBuildAllExamples.pro index 8f968df968..a8c7ec1876 100644 --- a/JKQtPlotterBuildAllExamples.pro +++ b/JKQtPlotterBuildAllExamples.pro @@ -52,6 +52,8 @@ addSimpleTest(rgbimageplot_qt) addSimpleTest(impulsesplot) addSimpleTest(paramscatterplot) addSimpleTest(parametriccurve) +addSimpleTest(parsedfunctionplot) +addSimpleTest(functionplot) #addSimpleTest(imageplot_nodatastore) #addSimpleTest(rgbimageplot_opencv) #addSimpleTest(imageplot_opencv) diff --git a/README.md b/README.md index d198e73b14..4236a24e93 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,8 @@ All test-projects are Qt-projects that use qmake to build. You can load them int | [![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_impulsesplot_small.png)](https://github.com/jkriege2/JKQtPlotter/tree/master/test/simpletest_impulsesplot) | [Impulse Plots](https://github.com/jkriege2/JKQtPlotter/tree/master/test/simpletest_impulsesplot) | `JKQTPimpulsesVerticalGraph` and `JKQTPimpulsesHorizontalGraph`
C++-style QVector as plot data | | [![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_paramscatterplot_small.png)](https://github.com/jkriege2/JKQtPlotter/tree/master/test/simpletest_paramscatterplot) | [Scatter Graph with Parametrized Symbols/Colors](https://github.com/jkriege2/JKQtPlotter/tree/master/test/simpletest_paramscatterplot) | `JKQTPxyParametrizedScatterGraph`
C++-style QVector as plot data
modify scatter/points/line-graph properties by data | | [![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_parametriccurve_small.png)](https://github.com/jkriege2/JKQtPlotter/tree/master/test/simpletest_parametriccurve) | [Plotting Parametric Curves](https://github.com/jkriege2/JKQtPlotter/tree/master/test/simpletest_parametriccurve) | `JKQTPxyLineGraph` and `JKQTPxyParametrizedScatterGraph`
C++-style QVector as plot data
parametric curve plotting | +| [![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_functionplot_small.png)](https://github.com/jkriege2/JKQtPlotter/tree/master/test/simpletest_functionplot) | [Plotting Mathematical Functions as Line Graphs](https://github.com/jkriege2/JKQtPlotter/tree/master/test/simpletest_functionplot) | `JKQTPxFunctionLineGraph`
diretly plotting C/C++-functions | +[![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_parsedfunctionplot_small.png)](https://github.com/jkriege2/JKQtPlotter/tree/master/test/simpletest_parsedfunctionplot) | [Plotting Parsed Mathematical Functions as Line Graphs](https://github.com/jkriege2/JKQtPlotter/tree/master/test/simpletest_parsedfunctionplot) | `JKQTPxParsedFunctionLineGraph`
plotting functions with the internal math equation parser/evaluator | ### Styling the Plot, Keys, Axes, ... diff --git a/lib/jkqtplotter.pri b/lib/jkqtplotter.pri index 28aec4706b..ba5152e424 100644 --- a/lib/jkqtplotter.pri +++ b/lib/jkqtplotter.pri @@ -22,7 +22,7 @@ HEADERS += $$PWD/jkqtplotter/jkqtpbaseplotter.h \ $$PWD/jkqtplottertools/jkqtpimagetools.h \ $$PWD/jkqtplotter/jkqtpgraphsbarchart.h \ $$PWD/jkqtplotter/jkqtpgraphsboxplot.h \ - $$PWD/jkqtplotter/jkqtpgraphsvaluatedfunction.h \ + $$PWD/jkqtplotter/jkqtpgraphsevaluatedfunction.h \ $$PWD/jkqtplotter/jkqtpgraphsfilledcurve.h \ $$PWD/jkqtplotter/jkqtpgraphsimpulses.h \ $$PWD/jkqtplotter/jkqtpgraphsparsedfunction.h \ @@ -54,7 +54,7 @@ SOURCES += $$PWD/jkqtplotter/jkqtpbaseplotter.cpp \ $$PWD/jkqtplottertools/jkqtpimagetools.cpp \ $$PWD/jkqtplotter/jkqtpgraphsbarchart.cpp \ $$PWD/jkqtplotter/jkqtpgraphsboxplot.cpp \ - $$PWD/jkqtplotter/jkqtpgraphsvaluatedfunction.cpp \ + $$PWD/jkqtplotter/jkqtpgraphsevaluatedfunction.cpp \ $$PWD/jkqtplotter/jkqtpgraphsfilledcurve.cpp \ $$PWD/jkqtplotter/jkqtpgraphsimpulses.cpp \ $$PWD/jkqtplotter/jkqtpgraphsparsedfunction.cpp \ diff --git a/lib/jkqtplotter/jkqtpgraphsvaluatedfunction.cpp b/lib/jkqtplotter/jkqtpgraphsevaluatedfunction.cpp similarity index 92% rename from lib/jkqtplotter/jkqtpgraphsvaluatedfunction.cpp rename to lib/jkqtplotter/jkqtpgraphsevaluatedfunction.cpp index d9cfa2d470..044eecb5e3 100644 --- a/lib/jkqtplotter/jkqtpgraphsvaluatedfunction.cpp +++ b/lib/jkqtplotter/jkqtpgraphsevaluatedfunction.cpp @@ -1,817 +1,846 @@ -/* - Copyright (c) 2008-2018 Jan W. Krieger () - - - - This software is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License (LGPL) as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License (LGPL) for more details. - - You should have received a copy of the GNU Lesser General Public License (LGPL) - along with this program. If not, see . -*/ - - - -#include "jkqtplotter/jkqtpgraphsvaluatedfunction.h" -#include "jkqtplotter/jkqtpbaseplotter.h" -#include -#include -#include -#include "jkqtplottertools/jkqtptools.h" -#include "jkqtplotter/jkqtpgraphsimage.h" -#include "jkqtplotter/jkqtpbaseelements.h" -#include "jkqtplotter/jkqtplotter.h" - - - -double JKQTPxFunctionLineGraphPolynomial(double x, void* param) { - double res=0; - QVector* d=static_cast*>(param); - if (d && d->size()>0) { - res=d->value(0,0); - double xx=x; - for (int i=1; isize(); i++) { - res=res+d->value(i,0)*xx; - xx=xx*x; - } - } - - return res; -} - -double JKQTPxFunctionLineGraphExponential(double x, void* param) { - double res=0; - QVector* d=static_cast*>(param); - if (d) { - if (d->size()>=3) { - res=d->value(0,0)+d->value(1,0)*exp(x/d->value(2,0)); - } else if (d->size()>=2) { - res=d->value(0,0)*exp(x/d->value(1,0)); - } - } - return res; -} - -double JKQTPxFunctionLineGraphPowerLaw(double x, void* param) { - double res=0; - QVector* d=static_cast*>(param); - if (d) { - if (d->size()>=3) { - res=d->value(0,0)+d->value(1,0)*pow(x, d->value(2,1)); - } else if (d->size()>=2) { - res=d->value(0,0)*pow(x, d->value(1,1)); - } else if (d->size()>=1) { - res=pow(x, d->value(0,1)); - } - - } - return res; -} - - -JKQTPxFunctionLineGraph::JKQTPxFunctionLineGraph(JKQtBasePlotter* parent): - JKQTPgraph(parent) -{ - color=QColor("red"); - fillColor=color.lighter(); - style=Qt::SolidLine; - lineWidth=2; - fillStyle=Qt::SolidPattern; - drawLine=true; - fillCurve=false; - plotFunction=nullptr; - params=nullptr; - minSamples=10; - maxRefinementDegree=7; - slopeTolerance=0.005; - minPixelPerSample=32; - plotRefinement=true; - displaySamplePoints=false; - data=nullptr; - - drawErrorPolygons=false; - drawErrorLines=false; - errorPlotFunction=nullptr; - errorParams=nullptr; - errorColor=color.lighter(); - errorFillColor=color.lighter(); - errorStyle=Qt::SolidLine; - errorLineWidth=1; - errorFillStyle=Qt::SolidPattern; - - parameterColumn=-1; - errorParameterColumn=-1; - - - if (parent) { // get style settings from parent object - parentPlotStyle=parent->getNextStyle(); - //std::cout<<"got style settings from parent: "<getPlotStyle(parentPlotStyle).color(); - fillColor=color.lighter(); - style=parent->getPlotStyle(parentPlotStyle).style(); - errorColor=color.lighter(); - errorFillColor=color.lighter(); - errorStyle=style; - } - fillColor.setAlphaF(0.5); - errorFillColor.setAlphaF(0.5); -} - -JKQTPxFunctionLineGraph::JKQTPxFunctionLineGraph(JKQtPlotter* parent): - JKQTPgraph(parent) -{ - color=QColor("red"); - fillColor=color.lighter(); - style=Qt::SolidLine; - lineWidth=2; - fillStyle=Qt::SolidPattern; - drawLine=true; - fillCurve=false; - plotFunction=nullptr; - params=nullptr; - minSamples=10; - maxRefinementDegree=7; - slopeTolerance=0.005; - minPixelPerSample=32; - plotRefinement=true; - displaySamplePoints=false; - data=nullptr; - - drawErrorPolygons=false; - drawErrorLines=false; - errorPlotFunction=nullptr; - errorParams=nullptr; - errorColor=color.lighter(); - errorFillColor=color.lighter(); - errorStyle=Qt::SolidLine; - errorLineWidth=1; - errorFillStyle=Qt::SolidPattern; - - parameterColumn=-1; - errorParameterColumn=-1; - - - if (parent) { // get style settings from parent object - parentPlotStyle=parent->getNextStyle(); - //std::cout<<"got style settings from parent: "<getPlotStyle(parentPlotStyle).color(); - fillColor=color.lighter(); - style=parent->getPlotStyle(parentPlotStyle).style(); - errorColor=color.lighter(); - errorFillColor=color.lighter(); - errorStyle=style; - } - fillColor.setAlphaF(0.5); - errorFillColor.setAlphaF(0.5); -} - - -JKQTPxFunctionLineGraph::~JKQTPxFunctionLineGraph() { - clearData(); -} - -void JKQTPxFunctionLineGraph::clearData() { - while (data!=nullptr) { - doublePair* d=data; - data=data->next; - delete d; - } - data=nullptr; -} - - -void JKQTPxFunctionLineGraph::drawKeyMarker(JKQTPEnhancedPainter& painter, QRectF& rect) { - painter.save(); - QPen p=painter.pen(); - p.setJoinStyle(Qt::RoundJoin); - p.setCapStyle(Qt::RoundCap); - QPen np(Qt::NoPen); - p.setColor(color); - p.setStyle(style); - QBrush b=painter.brush(); - b.setColor(fillColor); - b.setStyle(fillStyle); - int y=rect.top()+rect.height()/2.0; - painter.setPen(np); - if (drawLine) painter.setPen(p); - painter.setBrush(b); - if (fillCurve) painter.drawRect(rect); - if (!fillCurve & drawLine) painter.drawLine(QLineF(rect.left(), y, rect.right(), y)); - painter.restore(); -} - -QColor JKQTPxFunctionLineGraph::getKeyLabelColor() { - return color; -} - -bool JKQTPxFunctionLineGraph::getXMinMax(double &minx, double &maxx, double &smallestGreaterZero) -{ - smallestGreaterZero=minx=maxx=0; return false; -} - -bool JKQTPxFunctionLineGraph::getYMinMax(double &miny, double &maxy, double &smallestGreaterZero) -{ - smallestGreaterZero=miny=maxy=0; return false; -} - -void JKQTPxFunctionLineGraph::createPlotData(bool collectParams) { -#ifdef JKQTBP_AUTOTIMER - JKQTPAutoOutputTimer jkaat(QString("JKQTPxFunctionLineGraph[%1]::createPlotData()").arg(title)); -#endif - clearData(); - if (collectParams) collectParameters(); - - if (parent==nullptr) return; - if (plotFunction==nullptr) return; - - double xmin=parent->getXMin(); - double xmax=parent->getXMax(); - double pxmin=xAxis->x2p(xmin); - double pxmax=xAxis->x2p(xmax); - double delta0=(pxmax-pxmin)/(double)minSamples; - //double logdelta0=(log(xmax)-log(xmin))/(double)minSamples; - - // initially sample function - doublePair* d=new doublePair; - d->x=xmin; - d->f=plotFunction(xmin, params); - d->next=nullptr; - data=d; - /*if (parent && parent->getXAxis()->isLogAxis()) { - for (double x=log(xmin)+logdelta0; xnext = new doublePair; - d->next->x=exp(x+((double)rand()/(double)RAND_MAX-0.5)*delta0/2.0); - d->next->f=plotFunction(d->next->x, params); - d->next->next=nullptr; - doublePair* dd=d; - d=d->next; - refine(dd, d); - } - } else {*/ - QVector* dv=static_cast*>(params); - if (plotFunction==JKQTPxFunctionLineGraphPolynomial && dv && dv->size()<=2) { - // we only need the first and last datapoint - } else { - for (double x=pxmin+delta0; xnext = new doublePair; - d->next->x=parent->p2x(x+((double)rand()/(double)RAND_MAX-0.5)*delta0/2.0); - d->next->f=plotFunction(d->next->x, params); - d->next->next=nullptr; - doublePair* dd=d; - d=d->next; - refine(dd, d); - } - } - //} - d->next = new doublePair; - d->next->x=xmax; - d->next->f=plotFunction(xmax, params); - d->next->next=nullptr; - refine(d, d->next); - -} - -void JKQTPxFunctionLineGraph::collectParameters() -{ - if (parent && parameterColumn>=0) { - iparams.clear(); - JKQTPdatastore* datastore=parent->getDatastore(); - int imin=0; - int imax=datastore->getColumn(parameterColumn).getRows(); - - for (int i=imin; iget(parameterColumn,i); - iparams<=0 && !JKQTPIsOKFloat(iparams[i])) { - iparams.remove(i,1); - i--; - } - - //qDebug()<<"iparams:"; - //for (i=0; i=0) { - ierrorparams.clear(); - JKQTPdatastore* datastore=parent->getDatastore(); - int imin=0; - int imax=datastore->getColumn(errorParameterColumn).getRows(); - - for (int i=imin; iget(errorParameterColumn,i); - ierrorparams<=0 && !JKQTPIsOKFloat(ierrorparams[i])) { - ierrorparams.remove(i,1); - i--; - } - - errorParams=&ierrorparams; - } -} - -void JKQTPxFunctionLineGraph::refine(doublePair* a, doublePair* b, unsigned int degree) { - if (degree>=maxRefinementDegree) return; - double ax=xAxis->x2p(a->x); - double af=xAxis->x2p(a->f); - double bx=xAxis->x2p(b->x); - double bf=xAxis->x2p(b->f); - - double delta=bx - ax; - //double logdelta=log(bx) - log(ax); - double xmid=ax+(delta)/2.0; - /*if (parent && parent->getXAxis()->isLogAxis()) { - xmid=log(a->x)+(logdelta)/2.0; - xmid=xmid+((double)rand()/(double)RAND_MAX-0.5)*delta/5.0; - xmid=exp(xmid); - } else {*/ - xmid=xmid+((double)rand()/(double)RAND_MAX-0.5)*delta/5.0; // shake by 10% - //} - double realxmid=parent->p2x(xmid); - double realfmid=plotFunction(realxmid, params); - double fmid=yAxis->x2p(realfmid); - double a1=(fmid - af)/(xmid - ax); - double a2=(bf - fmid)/(bx - xmid); - //std::cout<x<<", "<f<<"], ["<x<<", "<f<<"] ): a1="<slopeTolerance || delta>minPixelPerSample) { - doublePair* dmid = new doublePair; - dmid->x=realxmid; - dmid->f=realfmid; - a->next=dmid; - dmid->next=b; - refine(a, dmid, degree+1); - refine(dmid, b, degree+1); - } -} - - -void JKQTPxFunctionLineGraph::draw(JKQTPEnhancedPainter& painter) { -#ifdef JKQTBP_AUTOTIMER - JKQTPAutoOutputTimer jkaaot("JKQTPxFunctionLineGraph::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(); - - QPen p=painter.pen(); - p.setColor(color); - p.setWidthF(qMax(JKQTPLOTTER_ABS_MIN_LINEWIDTH, parent->pt2px(painter, lineWidth*parent->get_lineWidthMultiplier()))); - p.setStyle(style); - p.setJoinStyle(Qt::RoundJoin); - p.setJoinStyle(Qt::RoundJoin); - p.setCapStyle(Qt::RoundCap); - QPen np(Qt::NoPen); - - QPen ep=painter.pen(); - ep.setColor(errorColor); - ep.setWidthF(qMax(JKQTPLOTTER_ABS_MIN_LINEWIDTH, parent->pt2px(painter, errorLineWidth*parent->get_lineWidthMultiplier()))); - ep.setStyle(errorStyle); - ep.setJoinStyle(Qt::RoundJoin); - - QBrush b=painter.brush(); - b.setColor(fillColor); - b.setStyle(fillStyle); - - QBrush eb=painter.brush(); - eb.setColor(errorFillColor); - eb.setStyle(errorFillStyle); - - -// double xold=-1; -// double yold=-1; -// double ypeold=-1; -// double ymeold=-1; - -// double x0=xAxis->x2p(0); -// if (parent->getXAxis()->isLogAxis()) x0=xAxis->x2p(parent->getXAxis()->getMin()); - double y0=yAxis->x2p(0); - if (parent->getYAxis()->isLogAxis()) y0=yAxis->x2p(parent->getYAxis()->getMin()); - bool first=false; - doublePair* d=data; - //QPainterPath pa, pfill; - //QPainterPath pel, pef; - QPolygonF filledPolygon, linePolygon, errorLineTop, errorLineBottom; - QList epTop, epBottom; - double yami=qMin(yAxis->x2p(parent->getYAxis()->getMin()),yAxis->x2p(parent->getYAxis()->getMax())); - double yama=qMax(yAxis->x2p(parent->getYAxis()->getMin()),yAxis->x2p(parent->getYAxis()->getMax())); - double dypix=fabs(yama-yami); - yami=yami-2*dypix; - yama=yama+2*dypix; - while (d!=nullptr) { - - double xv=d->x; - double yv=d->f; - //std::cout<<"(xv, yv) = ( "<x2p(xv); - double y=yAxis->x2p(yv); - double ype=0, yme=0; - if ((drawErrorLines || drawErrorPolygons) && (errorPlotFunction!=nullptr)) { - double e=errorPlotFunction(xv, errorParams); - ype=yAxis->x2p(yv+e); - yme=yAxis->x2p(yv-e); - ype=qBound(yami, ype, yama); - yme=qBound(yami, yme, yama); - } - - y=qBound(yami, y, yama); - - if (fillCurve) { - if (!first) filledPolygon<next) filledPolygon<next; - } - if (drawErrorPolygons) { - painter.save(); - painter.setBrush(eb); - painter.setPen(np); - QPolygonF poly; - //poly << QPointF(xold, ypeold) << QPointF(x, ype)<< QPointF(x, yme) << QPointF(xold, ymeold) ; - for (int i=0; i=0; i--) { - poly<x; - double yv=d->f; - //std::cout<<"(xv, yv) = ( "<x2p(xv); - double y=yAxis->x2p(yv); - JKQTPplotSymbol(painter, x, y, JKQTPcross, 6,1*parent->get_lineWidthMultiplier(), c, QColor(Qt::transparent)); - } - d=d->next; - } - painter.restore(); - } - painter.restore(); - drawErrorsAfter(painter); - //std::cout<<"plot done\n"; -} - - - - - - - - - - - - - - - -void JKQTPyFunctionLineGraph::draw(JKQTPEnhancedPainter& painter) { -#ifdef JKQTBP_AUTOTIMER - JKQTPAutoOutputTimer jkaaot("JKQTPyFunctionLineGraph::draw"); -#endif - if (parent==nullptr) return; - JKQTPdatastore* datastore=parent->getDatastore(); - if (datastore==nullptr) return; - - //std::cout<<"start plot\n"; - createPlotData(); - //std::cout<<"plot data created\n"; - - drawErrorsBefore(painter); - - painter.save(); - - QPen p=painter.pen(); - p.setColor(color); - p.setWidthF(qMax(JKQTPLOTTER_ABS_MIN_LINEWIDTH, parent->pt2px(painter, lineWidth*parent->get_lineWidthMultiplier()))); - p.setStyle(style); - p.setJoinStyle(Qt::RoundJoin); - p.setJoinStyle(Qt::RoundJoin); - p.setCapStyle(Qt::RoundCap); - QPen np(Qt::NoPen); - - QPen ep=painter.pen(); - ep.setColor(errorColor); - ep.setWidthF(qMax(JKQTPLOTTER_ABS_MIN_LINEWIDTH, parent->pt2px(painter, errorLineWidth*parent->get_lineWidthMultiplier()))); - ep.setStyle(errorStyle); - ep.setJoinStyle(Qt::RoundJoin); - - QBrush b=painter.brush(); - b.setColor(fillColor); - b.setStyle(fillStyle); - - QBrush eb=painter.brush(); - eb.setColor(errorFillColor); - eb.setStyle(errorFillStyle); - - - double xold=-1; - double yold=-1; - double xpeold=-1; - double xmeold=-1; - - double x0=xAxis->x2p(0); - if (parent->getXAxis()->isLogAxis()) x0=xAxis->x2p(parent->getXAxis()->getMin()); -// double y0=yAxis->x2p(0); -// if (parent->getYAxis()->isLogAxis()) y0=yAxis->x2p(parent->getYAxis()->getMin()); - bool first=false; - doublePair* d=data; - - while (d!=nullptr) { - double yv=d->x; - double xv=d->f; - //std::cout<<"(xv, yv) = ( "<x2p(xv); - double y=yAxis->x2p(yv); - double xpe=0, xme=0; - if ((drawErrorLines || drawErrorPolygons) && (errorPlotFunction!=nullptr)) { - double e=errorPlotFunction(xv, errorParams); - xpe=xAxis->x2p(xv+e); - xme=xAxis->x2p(xv-e); - } - - if (first) { - double xl1=xold; - double yl1=yold; - double xl2=x; - double yl2=y; - - if (fillCurve) { - painter.save(); - painter.setBrush(b); - painter.setPen(np); - QPolygonF poly; - poly << QPointF(xl1, yl1) << QPointF(xl2, yl2) << QPointF(x0, yl2) << QPointF(x0, yl1); - painter.drawConvexPolygon(poly); - painter.restore(); - /*pfill.lineTo(x, y); - if (d->next==nullptr) { // last datapoint - pfill.lineTo(x, y0); - }*/ - } - - if (drawErrorPolygons && (errorPlotFunction!=nullptr)) { - painter.save(); - painter.setBrush(eb); - painter.setPen(np); - QPolygonF poly; - poly << QPointF(xpeold, yold) << QPointF(xpe, y)<< QPointF(xme, y) << QPointF(xmeold, yold) ; - painter.drawConvexPolygon(poly); - painter.restore(); - } - - if (drawLine) { - painter.setPen(p); - //pa.lineTo(x, y); - painter.drawLine(QLineF(xl1, yl1, xl2, yl2)); - } - - if (drawErrorLines && (errorPlotFunction!=nullptr)) { - painter.setPen(ep); - painter.drawLine(QLineF(xpeold, yold, xpe, y)); - painter.drawLine(QLineF(xmeold, yold, xme, y)); - } - - //std::cout<<"line ("<next; - } - /*if (fillCurve) { - pfill.closeSubpath(); - painter.save(); - painter.setBrush(b); - painter.setPen(np); - painter.drawPath(pfill); - painter.restore(); - } - - if (drawLine) { - painter.setPen(p); - painter.drawPath(pa); - painter.restore(); - }*/ - - QColor c=color; - c.setHsv(fmod(color.hue()+90, 360), color.saturation(), color.value()); - d=data; - if (displaySamplePoints) while (d!=nullptr) { - double yv=d->x; - double xv=d->f; - //std::cout<<"(xv, yv) = ( "<x2p(xv); - double y=yAxis->x2p(yv); - JKQTPplotSymbol(painter, x, y, JKQTPcross, 6, 1*parent->get_lineWidthMultiplier(), c, QColor(Qt::transparent)); - } - d=d->next; - } - painter.restore(); - drawErrorsAfter(painter); - //std::cout<<"plot done\n"; -} - - -void JKQTPyFunctionLineGraph::createPlotData(bool /*collectParams*/) { - clearData(); - - if (parent==nullptr) return; - if (plotFunction==nullptr) return; - - double ymin=parent->getYMin(); - double ymax=parent->getYMax(); - double delta0=(ymax-ymin)/(double)minSamples; - - // initially sample function - doublePair* d=new doublePair; - d->x=ymin; - d->f=plotFunction(ymin, params); - d->next=nullptr; - data=d; - for (double y=ymin+delta0; ynext = new doublePair; - d->next->x=y+((double)rand()/(double)RAND_MAX-0.5)*delta0/2.0; - d->next->f=plotFunction(d->next->x, params); - d->next->next=nullptr; - doublePair* dd=d; - d=d->next; - refine(dd, d); - } - d->next = new doublePair; - d->next->x=ymax; - d->next->f=plotFunction(ymax, params); - d->next->next=nullptr; - refine(d, d->next); - -} - - - -QBrush JKQTPxFunctionLineGraph::getBrush(JKQTPEnhancedPainter& /*painter*/) const { - QBrush b; - b.setColor(fillColor); - b.setStyle(fillStyle); - return b; -} - -QPen JKQTPxFunctionLineGraph::getLinePen(JKQTPEnhancedPainter &painter) const { - QPen p; - p.setColor(color); - p.setWidthF(qMax(JKQTPLOTTER_ABS_MIN_LINEWIDTH,parent->pt2px(painter, parent->get_lineWidthMultiplier()*lineWidth))); - p.setStyle(style); - p.setJoinStyle(Qt::RoundJoin); - p.setCapStyle(Qt::RoundCap); - - return p; -} - -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(JKQTPLOTTER_ABS_MIN_LINEWIDTH,parent->pt2px(painter, parent->get_lineWidthMultiplier()*errorLineWidth))); - p.setStyle(errorStyle); - p.setJoinStyle(Qt::RoundJoin); - p.setCapStyle(Qt::RoundCap); - - return p; -} - - -void JKQTPxFunctionLineGraph::set_params(const QVector ¶ms) -{ - iparams=params; - set_params(&iparams); -} - -void JKQTPxFunctionLineGraph::set_copiedParams(const double *params, int N) -{ - QVector v; - for (int i=0; i &errorParams) -{ - ierrorparams=errorParams; - set_errorParams(&ierrorparams); -} - - -void JKQTPxFunctionLineGraph::setSpecialFunction(JKQTPxFunctionLineGraph::SpecialFunction function) -{ - if (function==JKQTPxFunctionLineGraph::Polynomial) set_plotFunction(JKQTPxFunctionLineGraphPolynomial); - else if (function==JKQTPxFunctionLineGraph::Exponential) set_plotFunction(JKQTPxFunctionLineGraphExponential); - else if (function==JKQTPxFunctionLineGraph::PowerLaw) set_plotFunction(JKQTPxFunctionLineGraphPowerLaw); -} - -QVector JKQTPxFunctionLineGraph::get_internalParams() const { - return iparams; -} -QVector JKQTPxFunctionLineGraph::get_internalErrorParams() const { - return ierrorparams; -} - - -bool JKQTPxFunctionLineGraph::usesColumn(int c) -{ - return (c==parameterColumn)||(c==errorParameterColumn); -} - +/* + Copyright (c) 2008-2018 Jan W. Krieger () + + + + This software is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License (LGPL) as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License (LGPL) for more details. + + You should have received a copy of the GNU Lesser General Public License (LGPL) + along with this program. If not, see . +*/ + + + +#include "jkqtplotter/jkqtpgraphsevaluatedfunction.h" +#include "jkqtplotter/jkqtpbaseplotter.h" +#include +#include +#include +#include "jkqtplottertools/jkqtptools.h" +#include "jkqtplotter/jkqtpgraphsimage.h" +#include "jkqtplotter/jkqtpbaseelements.h" +#include "jkqtplotter/jkqtplotter.h" + + + +double JKQTPxFunctionLineGraphPolynomial(double x, void* param) { + double res=0; + QVector* d=static_cast*>(param); + if (d && d->size()>0) { + res=d->value(0,0); + double xx=x; + for (int i=1; isize(); i++) { + res=res+d->value(i,0)*xx; + xx=xx*x; + } + } + + return res; +} + +double JKQTPxFunctionLineGraphExponential(double x, void* param) { + double res=0; + QVector* d=static_cast*>(param); + if (d) { + if (d->size()>=3) { + res=d->value(0,0)+d->value(1,0)*exp(x/d->value(2,0)); + } else if (d->size()>=2) { + res=d->value(0,0)*exp(x/d->value(1,0)); + } + } + return res; +} + +double JKQTPxFunctionLineGraphPowerLaw(double x, void* param) { + double res=0; + QVector* d=static_cast*>(param); + if (d) { + if (d->size()>=3) { + res=d->value(0,0)+d->value(1,0)*pow(x, d->value(2,1)); + } else if (d->size()>=2) { + res=d->value(0,0)*pow(x, d->value(1,1)); + } else if (d->size()>=1) { + res=pow(x, d->value(0,1)); + } + + } + return res; +} + + +JKQTPxFunctionLineGraph::JKQTPxFunctionLineGraph(JKQtBasePlotter* parent): + JKQTPgraph(parent) +{ + color=QColor("red"); + fillColor=color.lighter(); + style=Qt::SolidLine; + lineWidth=2; + fillStyle=Qt::SolidPattern; + drawLine=true; + fillCurve=false; + plotFunction=nullptr; + params=nullptr; + minSamples=10; + maxRefinementDegree=7; + slopeTolerance=0.005; + minPixelPerSample=32; + plotRefinement=true; + displaySamplePoints=false; + data=nullptr; + + drawErrorPolygons=false; + drawErrorLines=false; + errorPlotFunction=nullptr; + errorParams=nullptr; + errorColor=color.lighter(); + errorFillColor=color.lighter(); + errorStyle=Qt::SolidLine; + errorLineWidth=1; + errorFillStyle=Qt::SolidPattern; + + parameterColumn=-1; + errorParameterColumn=-1; + + + if (parent) { // get style settings from parent object + parentPlotStyle=parent->getNextStyle(); + //std::cout<<"got style settings from parent: "<getPlotStyle(parentPlotStyle).color(); + fillColor=color.lighter(); + style=parent->getPlotStyle(parentPlotStyle).style(); + errorColor=color.lighter(); + errorFillColor=color.lighter(); + errorStyle=style; + } + fillColor.setAlphaF(0.5); + errorFillColor.setAlphaF(0.5); +} + +JKQTPxFunctionLineGraph::JKQTPxFunctionLineGraph(JKQtPlotter* parent): + JKQTPgraph(parent) +{ + color=QColor("red"); + fillColor=color.lighter(); + style=Qt::SolidLine; + lineWidth=2; + fillStyle=Qt::SolidPattern; + drawLine=true; + fillCurve=false; + plotFunction=nullptr; + params=nullptr; + minSamples=10; + maxRefinementDegree=7; + slopeTolerance=0.005; + minPixelPerSample=32; + plotRefinement=true; + displaySamplePoints=false; + data=nullptr; + + drawErrorPolygons=false; + drawErrorLines=false; + errorPlotFunction=nullptr; + errorParams=nullptr; + errorColor=color.lighter(); + errorFillColor=color.lighter(); + errorStyle=Qt::SolidLine; + errorLineWidth=1; + errorFillStyle=Qt::SolidPattern; + + parameterColumn=-1; + errorParameterColumn=-1; + + + if (parent) { // get style settings from parent object + parentPlotStyle=parent->getNextStyle(); + //std::cout<<"got style settings from parent: "<getPlotStyle(parentPlotStyle).color(); + fillColor=color.lighter(); + style=parent->getPlotStyle(parentPlotStyle).style(); + errorColor=color.lighter(); + errorFillColor=color.lighter(); + errorStyle=style; + } + fillColor.setAlphaF(0.5); + errorFillColor.setAlphaF(0.5); +} + + +JKQTPxFunctionLineGraph::~JKQTPxFunctionLineGraph() { + clearData(); +} + +void JKQTPxFunctionLineGraph::clearData() { + while (data!=nullptr) { + doublePair* d=data; + data=data->next; + delete d; + } + data=nullptr; +} + +void JKQTPxFunctionLineGraph::set_plotFunction(const jkqtpPlotFunctionType &__value) +{ + this->plotFunction = __value; + clearData(); +} + +void JKQTPxFunctionLineGraph::set_plotFunction(jkqtpPlotFunctionType &&__value) +{ + this->plotFunction = std::move(__value); + clearData(); +} + +jkqtpPlotFunctionType JKQTPxFunctionLineGraph::get_plotFunction() const +{ + return this->plotFunction; +} + + +void JKQTPxFunctionLineGraph::drawKeyMarker(JKQTPEnhancedPainter& painter, QRectF& rect) { + painter.save(); + QPen p=painter.pen(); + p.setJoinStyle(Qt::RoundJoin); + p.setCapStyle(Qt::RoundCap); + QPen np(Qt::NoPen); + p.setColor(color); + p.setStyle(style); + QBrush b=painter.brush(); + b.setColor(fillColor); + b.setStyle(fillStyle); + int y=rect.top()+rect.height()/2.0; + painter.setPen(np); + if (drawLine) painter.setPen(p); + painter.setBrush(b); + if (fillCurve) painter.drawRect(rect); + if (!fillCurve & drawLine) painter.drawLine(QLineF(rect.left(), y, rect.right(), y)); + painter.restore(); +} + +QColor JKQTPxFunctionLineGraph::getKeyLabelColor() { + return color; +} + +bool JKQTPxFunctionLineGraph::getXMinMax(double &minx, double &maxx, double &smallestGreaterZero) +{ + smallestGreaterZero=minx=maxx=0; return false; +} + +bool JKQTPxFunctionLineGraph::getYMinMax(double &miny, double &maxy, double &smallestGreaterZero) +{ + smallestGreaterZero=miny=maxy=0; return false; +} + +void JKQTPxFunctionLineGraph::createPlotData(bool collectParams) { +#ifdef JKQTBP_AUTOTIMER + JKQTPAutoOutputTimer jkaat(QString("JKQTPxFunctionLineGraph[%1]::createPlotData()").arg(title)); +#endif + clearData(); + if (collectParams) collectParameters(); + + if (parent==nullptr) return; + if (plotFunction==nullptr) return; + + double xmin=parent->getXMin(); + double xmax=parent->getXMax(); + double pxmin=xAxis->x2p(xmin); + double pxmax=xAxis->x2p(xmax); + double delta0=(pxmax-pxmin)/(double)minSamples; + //double logdelta0=(log(xmax)-log(xmin))/(double)minSamples; + + // initially sample function + doublePair* d=new doublePair; + d->x=xmin; + d->f=plotFunction(xmin, params); + d->next=nullptr; + data=d; + /*if (parent && parent->getXAxis()->isLogAxis()) { + for (double x=log(xmin)+logdelta0; xnext = new doublePair; + d->next->x=exp(x+((double)rand()/(double)RAND_MAX-0.5)*delta0/2.0); + d->next->f=plotFunction(d->next->x, params); + d->next->next=nullptr; + doublePair* dd=d; + d=d->next; + refine(dd, d); + } + } else {*/ + QVector* dv=static_cast*>(params); + for (double x=pxmin+delta0; xnext = new doublePair; + d->next->x=parent->p2x(x+((double)rand()/(double)RAND_MAX-0.5)*delta0/2.0); + d->next->f=plotFunction(d->next->x, params); + d->next->next=nullptr; + doublePair* dd=d; + d=d->next; + refine(dd, d); + } + + //} + d->next = new doublePair; + d->next->x=xmax; + d->next->f=plotFunction(xmax, params); + d->next->next=nullptr; + refine(d, d->next); + +} + +void JKQTPxFunctionLineGraph::collectParameters() +{ + if (parent && parameterColumn>=0) { + iparams.clear(); + JKQTPdatastore* datastore=parent->getDatastore(); + int imin=0; + int imax=datastore->getColumn(parameterColumn).getRows(); + + for (int i=imin; iget(parameterColumn,i); + iparams<=0 && !JKQTPIsOKFloat(iparams[i])) { + iparams.remove(i,1); + i--; + } + + //qDebug()<<"iparams:"; + //for (i=0; i=0) { + ierrorparams.clear(); + JKQTPdatastore* datastore=parent->getDatastore(); + int imin=0; + int imax=datastore->getColumn(errorParameterColumn).getRows(); + + for (int i=imin; iget(errorParameterColumn,i); + ierrorparams<=0 && !JKQTPIsOKFloat(ierrorparams[i])) { + ierrorparams.remove(i,1); + i--; + } + + errorParams=&ierrorparams; + } +} + +void JKQTPxFunctionLineGraph::refine(doublePair* a, doublePair* b, unsigned int degree) { + if (degree>=maxRefinementDegree) return; + double ax=xAxis->x2p(a->x); + double af=xAxis->x2p(a->f); + double bx=xAxis->x2p(b->x); + double bf=xAxis->x2p(b->f); + + double delta=bx - ax; + //double logdelta=log(bx) - log(ax); + double xmid=ax+(delta)/2.0; + /*if (parent && parent->getXAxis()->isLogAxis()) { + xmid=log(a->x)+(logdelta)/2.0; + xmid=xmid+((double)rand()/(double)RAND_MAX-0.5)*delta/5.0; + xmid=exp(xmid); + } else {*/ + xmid=xmid+((double)rand()/(double)RAND_MAX-0.5)*delta/5.0; // shake by 10% + //} + double realxmid=parent->p2x(xmid); + double realfmid=plotFunction(realxmid, params); + double fmid=yAxis->x2p(realfmid); + double a1=(fmid - af)/(xmid - ax); + double a2=(bf - fmid)/(bx - xmid); + //std::cout<x<<", "<f<<"], ["<x<<", "<f<<"] ): a1="<slopeTolerance || delta>minPixelPerSample) { + doublePair* dmid = new doublePair; + dmid->x=realxmid; + dmid->f=realfmid; + a->next=dmid; + dmid->next=b; + refine(a, dmid, degree+1); + refine(dmid, b, degree+1); + } +} + + +void JKQTPxFunctionLineGraph::draw(JKQTPEnhancedPainter& painter) { +#ifdef JKQTBP_AUTOTIMER + JKQTPAutoOutputTimer jkaaot("JKQTPxFunctionLineGraph::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(); + + QPen p=painter.pen(); + p.setColor(color); + p.setWidthF(qMax(JKQTPLOTTER_ABS_MIN_LINEWIDTH, parent->pt2px(painter, lineWidth*parent->get_lineWidthMultiplier()))); + p.setStyle(style); + p.setJoinStyle(Qt::RoundJoin); + p.setJoinStyle(Qt::RoundJoin); + p.setCapStyle(Qt::RoundCap); + QPen np(Qt::NoPen); + + QPen ep=painter.pen(); + ep.setColor(errorColor); + ep.setWidthF(qMax(JKQTPLOTTER_ABS_MIN_LINEWIDTH, parent->pt2px(painter, errorLineWidth*parent->get_lineWidthMultiplier()))); + ep.setStyle(errorStyle); + ep.setJoinStyle(Qt::RoundJoin); + + QBrush b=painter.brush(); + b.setColor(fillColor); + b.setStyle(fillStyle); + + QBrush eb=painter.brush(); + eb.setColor(errorFillColor); + eb.setStyle(errorFillStyle); + + +// double xold=-1; +// double yold=-1; +// double ypeold=-1; +// double ymeold=-1; + +// double x0=xAxis->x2p(0); +// if (parent->getXAxis()->isLogAxis()) x0=xAxis->x2p(parent->getXAxis()->getMin()); + double y0=yAxis->x2p(0); + if (parent->getYAxis()->isLogAxis()) y0=yAxis->x2p(parent->getYAxis()->getMin()); + bool first=false; + doublePair* d=data; + //QPainterPath pa, pfill; + //QPainterPath pel, pef; + QPolygonF filledPolygon, linePolygon, errorLineTop, errorLineBottom; + QList epTop, epBottom; + double yami=qMin(yAxis->x2p(parent->getYAxis()->getMin()),yAxis->x2p(parent->getYAxis()->getMax())); + double yama=qMax(yAxis->x2p(parent->getYAxis()->getMin()),yAxis->x2p(parent->getYAxis()->getMax())); + double dypix=fabs(yama-yami); + yami=yami-2*dypix; + yama=yama+2*dypix; + while (d!=nullptr) { + + double xv=d->x; + double yv=d->f; + //std::cout<<"(xv, yv) = ( "<x2p(xv); + double y=yAxis->x2p(yv); + double ype=0, yme=0; + if ((drawErrorLines || drawErrorPolygons) && (static_cast(errorPlotFunction))) { + double e=errorPlotFunction(xv, errorParams); + ype=yAxis->x2p(yv+e); + yme=yAxis->x2p(yv-e); + ype=qBound(yami, ype, yama); + yme=qBound(yami, yme, yama); + } + + y=qBound(yami, y, yama); + + if (fillCurve) { + if (!first) filledPolygon<next) filledPolygon<(errorPlotFunction))) { + epTop<(errorPlotFunction))) { + errorLineTop<next; + } + if (drawErrorPolygons) { + painter.save(); + painter.setBrush(eb); + painter.setPen(np); + QPolygonF poly; + //poly << QPointF(xold, ypeold) << QPointF(x, ype)<< QPointF(x, yme) << QPointF(xold, ymeold) ; + for (int i=0; i=0; i--) { + poly<(errorPlotFunction))) { + painter.save(); + painter.setPen(ep); + painter.drawPolyline(errorLineTop); + painter.drawPolyline(errorLineBottom); + painter.restore(); + + } + + + QColor c=color; + c.setHsv(fmod(color.hue()+90, 360), color.saturation(), color.value()); + d=data; + if (displaySamplePoints) { + painter.save(); + while (d!=nullptr) { + double xv=d->x; + double yv=d->f; + //std::cout<<"(xv, yv) = ( "<x2p(xv); + double y=yAxis->x2p(yv); + JKQTPplotSymbol(painter, x, y, JKQTPcross, 6,1*parent->get_lineWidthMultiplier(), c, QColor(Qt::transparent)); + } + d=d->next; + } + painter.restore(); + } + painter.restore(); + drawErrorsAfter(painter); + //std::cout<<"plot done\n"; +} + + + + + + + + + + + + + + + +void JKQTPyFunctionLineGraph::draw(JKQTPEnhancedPainter& painter) { +#ifdef JKQTBP_AUTOTIMER + JKQTPAutoOutputTimer jkaaot("JKQTPyFunctionLineGraph::draw"); +#endif + if (parent==nullptr) return; + JKQTPdatastore* datastore=parent->getDatastore(); + if (datastore==nullptr) return; + + //std::cout<<"start plot\n"; + createPlotData(); + //std::cout<<"plot data created\n"; + + drawErrorsBefore(painter); + + painter.save(); + + QPen p=painter.pen(); + p.setColor(color); + p.setWidthF(qMax(JKQTPLOTTER_ABS_MIN_LINEWIDTH, parent->pt2px(painter, lineWidth*parent->get_lineWidthMultiplier()))); + p.setStyle(style); + p.setJoinStyle(Qt::RoundJoin); + p.setJoinStyle(Qt::RoundJoin); + p.setCapStyle(Qt::RoundCap); + QPen np(Qt::NoPen); + + QPen ep=painter.pen(); + ep.setColor(errorColor); + ep.setWidthF(qMax(JKQTPLOTTER_ABS_MIN_LINEWIDTH, parent->pt2px(painter, errorLineWidth*parent->get_lineWidthMultiplier()))); + ep.setStyle(errorStyle); + ep.setJoinStyle(Qt::RoundJoin); + + QBrush b=painter.brush(); + b.setColor(fillColor); + b.setStyle(fillStyle); + + QBrush eb=painter.brush(); + eb.setColor(errorFillColor); + eb.setStyle(errorFillStyle); + + + double xold=-1; + double yold=-1; + double xpeold=-1; + double xmeold=-1; + + double x0=xAxis->x2p(0); + if (parent->getXAxis()->isLogAxis()) x0=xAxis->x2p(parent->getXAxis()->getMin()); +// double y0=yAxis->x2p(0); +// if (parent->getYAxis()->isLogAxis()) y0=yAxis->x2p(parent->getYAxis()->getMin()); + bool first=false; + doublePair* d=data; + + while (d!=nullptr) { + double yv=d->x; + double xv=d->f; + //std::cout<<"(xv, yv) = ( "<x2p(xv); + double y=yAxis->x2p(yv); + double xpe=0, xme=0; + if ((drawErrorLines || drawErrorPolygons) && (static_cast(errorPlotFunction))) { + double e=errorPlotFunction(xv, errorParams); + xpe=xAxis->x2p(xv+e); + xme=xAxis->x2p(xv-e); + } + + if (first) { + double xl1=xold; + double yl1=yold; + double xl2=x; + double yl2=y; + + if (fillCurve) { + painter.save(); + painter.setBrush(b); + painter.setPen(np); + QPolygonF poly; + poly << QPointF(xl1, yl1) << QPointF(xl2, yl2) << QPointF(x0, yl2) << QPointF(x0, yl1); + painter.drawConvexPolygon(poly); + painter.restore(); + /*pfill.lineTo(x, y); + if (d->next==nullptr) { // last datapoint + pfill.lineTo(x, y0); + }*/ + } + + if (drawErrorPolygons && (static_cast(errorPlotFunction))) { + painter.save(); + painter.setBrush(eb); + painter.setPen(np); + QPolygonF poly; + poly << QPointF(xpeold, yold) << QPointF(xpe, y)<< QPointF(xme, y) << QPointF(xmeold, yold) ; + painter.drawConvexPolygon(poly); + painter.restore(); + } + + if (drawLine) { + painter.setPen(p); + //pa.lineTo(x, y); + painter.drawLine(QLineF(xl1, yl1, xl2, yl2)); + } + + if (drawErrorLines && (static_cast(errorPlotFunction))) { + painter.setPen(ep); + painter.drawLine(QLineF(xpeold, yold, xpe, y)); + painter.drawLine(QLineF(xmeold, yold, xme, y)); + } + + //std::cout<<"line ("<next; + } + /*if (fillCurve) { + pfill.closeSubpath(); + painter.save(); + painter.setBrush(b); + painter.setPen(np); + painter.drawPath(pfill); + painter.restore(); + } + + if (drawLine) { + painter.setPen(p); + painter.drawPath(pa); + painter.restore(); + }*/ + + QColor c=color; + c.setHsv(fmod(color.hue()+90, 360), color.saturation(), color.value()); + d=data; + if (displaySamplePoints) while (d!=nullptr) { + double yv=d->x; + double xv=d->f; + //std::cout<<"(xv, yv) = ( "<x2p(xv); + double y=yAxis->x2p(yv); + JKQTPplotSymbol(painter, x, y, JKQTPcross, 6, 1*parent->get_lineWidthMultiplier(), c, QColor(Qt::transparent)); + } + d=d->next; + } + painter.restore(); + drawErrorsAfter(painter); + //std::cout<<"plot done\n"; +} + + +void JKQTPyFunctionLineGraph::createPlotData(bool /*collectParams*/) { + clearData(); + + if (parent==nullptr) return; + if (plotFunction==nullptr) return; + + double ymin=parent->getYMin(); + double ymax=parent->getYMax(); + double delta0=(ymax-ymin)/(double)minSamples; + + // initially sample function + doublePair* d=new doublePair; + d->x=ymin; + d->f=plotFunction(ymin, params); + d->next=nullptr; + data=d; + for (double y=ymin+delta0; ynext = new doublePair; + d->next->x=y+((double)rand()/(double)RAND_MAX-0.5)*delta0/2.0; + d->next->f=plotFunction(d->next->x, params); + d->next->next=nullptr; + doublePair* dd=d; + d=d->next; + refine(dd, d); + } + d->next = new doublePair; + d->next->x=ymax; + d->next->f=plotFunction(ymax, params); + d->next->next=nullptr; + refine(d, d->next); + +} + + + +QBrush JKQTPxFunctionLineGraph::getBrush(JKQTPEnhancedPainter& /*painter*/) const { + QBrush b; + b.setColor(fillColor); + b.setStyle(fillStyle); + return b; +} + +QPen JKQTPxFunctionLineGraph::getLinePen(JKQTPEnhancedPainter &painter) const { + QPen p; + p.setColor(color); + p.setWidthF(qMax(JKQTPLOTTER_ABS_MIN_LINEWIDTH,parent->pt2px(painter, parent->get_lineWidthMultiplier()*lineWidth))); + p.setStyle(style); + p.setJoinStyle(Qt::RoundJoin); + p.setCapStyle(Qt::RoundCap); + + return p; +} + +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(JKQTPLOTTER_ABS_MIN_LINEWIDTH,parent->pt2px(painter, parent->get_lineWidthMultiplier()*errorLineWidth))); + p.setStyle(errorStyle); + p.setJoinStyle(Qt::RoundJoin); + p.setCapStyle(Qt::RoundCap); + + return p; +} + + +void JKQTPxFunctionLineGraph::set_params(const QVector ¶ms) +{ + iparams=params; + set_params(&iparams); +} + +void JKQTPxFunctionLineGraph::set_copiedParams(const double *params, int N) +{ + QVector v; + for (int i=0; i &errorParams) +{ + ierrorparams=errorParams; + set_errorParams(&ierrorparams); +} + + +void JKQTPxFunctionLineGraph::setSpecialFunction(JKQTPxFunctionLineGraph::SpecialFunction function) +{ + if (function==JKQTPxFunctionLineGraph::Polynomial) set_plotFunction(JKQTPxFunctionLineGraphPolynomial); + else if (function==JKQTPxFunctionLineGraph::Exponential) set_plotFunction(JKQTPxFunctionLineGraphExponential); + else if (function==JKQTPxFunctionLineGraph::PowerLaw) set_plotFunction(JKQTPxFunctionLineGraphPowerLaw); +} + +QVector JKQTPxFunctionLineGraph::get_internalParams() const { + return iparams; +} +QVector JKQTPxFunctionLineGraph::get_internalErrorParams() const { + return ierrorparams; +} + +void JKQTPxFunctionLineGraph::set_errorPlotFunction(const jkqtpPlotFunctionType &__value) +{ + errorPlotFunction=__value; +} + +void JKQTPxFunctionLineGraph::set_errorPlotFunction(jkqtpPlotFunctionType &&__value) +{ + this->errorPlotFunction = std::move(__value); + clearData(); +} +jkqtpPlotFunctionType JKQTPxFunctionLineGraph::get_errorPlotFunction() const +{ + return errorPlotFunction; +} + + +bool JKQTPxFunctionLineGraph::usesColumn(int c) +{ + return (c==parameterColumn)||(c==errorParameterColumn); +} + diff --git a/lib/jkqtplotter/jkqtpgraphsvaluatedfunction.h b/lib/jkqtplotter/jkqtpgraphsevaluatedfunction.h similarity index 85% rename from lib/jkqtplotter/jkqtpgraphsvaluatedfunction.h rename to lib/jkqtplotter/jkqtpgraphsevaluatedfunction.h index 4af7dfbe65..0456f3baa1 100644 --- a/lib/jkqtplotter/jkqtpgraphsvaluatedfunction.h +++ b/lib/jkqtplotter/jkqtpgraphsevaluatedfunction.h @@ -1,290 +1,317 @@ -/* - Copyright (c) 2008-2018 Jan W. Krieger () - - - - This software is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License (LGPL) as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License (LGPL) for more details. - - You should have received a copy of the GNU Lesser General Public License (LGPL) - along with this program. If not, see . -*/ - - - -/** - * \defgroup jkqtplotter_elements Plot Elements - * \ingroup jkqtplotter - * \defgroup jkqtplotter_plots Graphs - * \ingroup jkqtplotter_elements - */ - -/** \file jkqtpgraphs.h - * \ingroup jkqtplotter - */ - -#include -#include -#include -#include "jkqtplotter/jkqtpgraphs.h" -#include "jkqtplottertools/jkqtp_imexport.h" - -#ifndef jkqtpgraphsvaluatedfunction_H -#define jkqtpgraphsvaluatedfunction_H - - - - -/*! \brief type of functions that may be plottet - \ingroup jkqtplotter_plots - - This is the type of functions \f$ y=f(x, \vec{p}) \f$ that may be plottet by JKQTPxFunctionLineGraph - and JKQTPyFunctionLineGraph. It is possible to supply parameters \f$ \vec{p} \f$ to the function that - 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 double(*jkqtpPlotFunctionType)(double, void*); - - -/*! \brief This implements line plots where the data is taken from a user supplied function \f$ y=f(x) \f$ - \ingroup jkqtplotter_plots - - This class implements an intelligent plotting algorithm for functions. It starts by sampling - the function at minSamples positions. Then each function interval is bisected recursively if - necessary. To do so the function is evaluated at the mid point and the slopes \f$ \alpha_{\mbox{left}} \f$ - and \f$ \alpha_{\mbox{right}} \f$ of the two linear segments are compared. the midpoint is added - to the graph if \f[ \left|\alpha_{\mbox{right}}-\alpha_{\mbox{left}}\right|>\mbox{slopeTolerance} \f] - In addition all sampling points except minimum and maximum are beeing shifted by a random fraction their - distance to the other points. This helps to prevent beats when sampling periodic functions. - - the following image - \image html plot_functionplots.png - */ -class LIB_EXPORT JKQTPxFunctionLineGraph: public JKQTPgraph { - 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$ */ - }; - - /** \brief class constructor */ - JKQTPxFunctionLineGraph(JKQtBasePlotter* parent=nullptr); - - /** \brief class constructor */ - JKQTPxFunctionLineGraph(JKQtPlotter* parent); - - /** \brief class destructor */ - virtual ~JKQTPxFunctionLineGraph(); - - /** \brief plots the graph to the plotter object specified as parent */ - virtual void draw(JKQTPEnhancedPainter& painter); - /** \brief plots a key marker inside the specified rectangle \a rect */ - virtual void drawKeyMarker(JKQTPEnhancedPainter& painter, QRectF& rect); - /** \brief returns the color to be used for the key label */ - virtual QColor getKeyLabelColor(); - - /** \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); - /** \brief get the maximum and minimum y-value of the graph - */ - virtual bool getYMinMax(double& miny, double& maxy, double& smallestGreaterZero); - - /** \brief clear the data sampled from the function. */ - void clearData(); - - JKQTPGET_SET_MACRO(QColor, color) - JKQTPGET_SET_MACRO(QColor, fillColor) - JKQTPGET_SET_MACRO(Qt::BrushStyle, fillStyle) - JKQTPGET_SET_MACRO(Qt::PenStyle, style) - JKQTPGET_SET_MACRO(double, lineWidth) - JKQTPGET_SET_MACRO(bool, drawLine) - JKQTPGET_SET_MACRO_I(jkqtpPlotFunctionType, plotFunction, clearData()) - JKQTPGET_SET_MACRO_I(void*, params, clearData()) - /** \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!!!) */ - void set_params(const QVector& params); - /** \brief sets the params from a copy of the given array of length \a N */ - void set_copiedParams(const double* params, int N); - inline void set_paramsV(double p1) { - QVector p; - p< p; - p< p; - p< p; - p< p; - p< get_internalParams() const; - QVector get_internalErrorParams() const; - JKQTPGET_SET_MACRO(unsigned int, minSamples) - JKQTPGET_SET_MACRO(unsigned int, maxRefinementDegree) - JKQTPGET_SET_MACRO(double, slopeTolerance) - JKQTPGET_SET_MACRO(double, minPixelPerSample) - JKQTPGET_SET_MACRO(bool, plotRefinement) - JKQTPGET_SET_MACRO(bool, displaySamplePoints) - JKQTPGET_SET_MACRO(bool, drawErrorPolygons) - JKQTPGET_SET_MACRO(bool, drawErrorLines) - JKQTPGET_SET_MACRO(jkqtpPlotFunctionType, errorPlotFunction) - JKQTPGET_SET_MACRO(void*, errorParams) - /** \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 set_errorParams(const QVector& errorParams); - - JKQTPGET_SET_MACRO(int, parameterColumn) - JKQTPSET_CAST_MACRO(size_t, int, parameterColumn) - JKQTPGET_SET_MACRO(int, errorParameterColumn) - JKQTPSET_CAST_MACRO(size_t, int, errorParameterColumn) - - JKQTPGET_SET_MACRO(QColor, errorColor) - JKQTPGET_SET_MACRO(QColor, errorFillColor) - JKQTPGET_SET_MACRO(Qt::BrushStyle, errorFillStyle) - JKQTPGET_SET_MACRO(Qt::PenStyle, errorStyle) - JKQTPGET_SET_MACRO(double, errorLineWidth) - - /** \copydoc JKQTPgraph::usesColumn() */ - virtual bool usesColumn(int c); - - - /** \brief sets function to the given special function */ - void setSpecialFunction(SpecialFunction function); - protected: - /** \brief which plot style to use from the parent plotter (via JKQtPlotterBase::getPlotStyle() and JKQtPlotterBase::getNextStyle() ) */ - int parentPlotStyle; - - struct doublePair { - double x; - double f; - doublePair* next; - }; - /** \brief a linked list holding the datapoints \f$ \left(x, y=f(x, \vec{p})\right) \f$ to be plotted */ - doublePair* data; - - /** \brief fill the data array with data from the function plotFunction */ - virtual void createPlotData( bool collectParams=true); - - virtual void collectParameters(); - - void refine(doublePair* a, doublePair* b, unsigned int degree=0); - - int parameterColumn; - int errorParameterColumn; - - /** \brief color of the graph */ - QColor color; - /** \brief color of the graph fill */ - QColor fillColor; - /** \brief linestyle of the graph lines */ - Qt::PenStyle style; - /** \brief width (pixels) of the graph */ - double lineWidth; - /** \brief fill style, if the curve should be filled */ - Qt::BrushStyle fillStyle; - /** \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 pointer to the parameters supplied to the plotting funtion */ - void* params; - /** \brief the minimum number of points to evaluate the function at */ - unsigned int minSamples; - /** \brief the maximum number of recursive refinement steps - * - * each step bisects the interval \f$ [a, b] \f$ into two halfes. So the maximum number - * of points plotted at all are thus: - * \f[ \mbox{minSamples} \cdot 2^{\mbox{maxRefinementDegree}} \f] - */ - unsigned int maxRefinementDegree; - /** \brief the tolerance for the difference of two subsequent slopes */ - double slopeTolerance; - /** \brief create one sample at least every \a minPixelPerSample pixels */ - double minPixelPerSample; - /** \brief switch on or off [default: on] the plot refinement algorithm */ - bool plotRefinement; - /** \brief if true [default: off] display the points where the function has been sampled */ - bool displaySamplePoints; - /** \brief indicates whether an error polygon should be drawn */ - bool drawErrorPolygons; - /** \brief indicates whether error lines should be drawn */ - bool drawErrorLines; - /** \brief this function calculates the error at a given position */ - jkqtpPlotFunctionType errorPlotFunction; - /** \brief 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; - - - QBrush getBrush(JKQTPEnhancedPainter& painter) const; - QPen getLinePen(JKQTPEnhancedPainter& painter) const; - - QBrush getErrorBrush(JKQTPEnhancedPainter& painter) const; - QPen getErrorLinePen(JKQTPEnhancedPainter &painter) const; - - QVector iparams, ierrorparams; -}; - -/*! \brief This implements line plots where the data is taken from a user supplied function \f$ x=f(y) \f$ - \ingroup jkqtplotter_plots - - */ -class LIB_EXPORT JKQTPyFunctionLineGraph: public JKQTPxFunctionLineGraph { - Q_OBJECT - public: - /** \brief class constructor */ - inline JKQTPyFunctionLineGraph(JKQtBasePlotter* parent=nullptr):JKQTPxFunctionLineGraph(parent) {} - /** \brief class constructor */ - inline JKQTPyFunctionLineGraph(JKQtPlotter* parent):JKQTPxFunctionLineGraph(parent) {} - - /** \brief plots the graph to the plotter object specified as parent */ - virtual void draw(JKQTPEnhancedPainter& painter); - protected: - - /** \brief fill the data array with data from the function plotFunction */ - virtual void createPlotData( bool collectParams=true); - -}; - - - - -#endif // jkqtpgraphsvaluatedfunction_H +/* + Copyright (c) 2008-2018 Jan W. Krieger () + + + + This software is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License (LGPL) as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License (LGPL) for more details. + + You should have received a copy of the GNU Lesser General Public License (LGPL) + along with this program. If not, see . +*/ + + + +/** + * \defgroup jkqtplotter_elements Plot Elements + * \ingroup jkqtplotter + * \defgroup jkqtplotter_plots Graphs + * \ingroup jkqtplotter_elements + */ + +/** \file jkqtpgraphs.h + * \ingroup jkqtplotter + */ + +#include +#include +#include +#include "jkqtplotter/jkqtpgraphs.h" +#include "jkqtplottertools/jkqtp_imexport.h" +#include + +#ifndef jkqtpgraphsevaluatedfunction_H +#define jkqtpgraphsevaluatedfunction_H + + + + +/*! \brief type of functions that may be plottet + \ingroup jkqtplotter_plots + + This is the type of functions \f$ y=f(x, \vec{p}) \f$ that may be plottet by JKQTPxFunctionLineGraph + and JKQTPyFunctionLineGraph. It is possible to supply parameters \f$ \vec{p} \f$ to the function that + 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 jkqtpPlotFunctionType; + + +/*! \brief This implements line plots where the data is taken from a user supplied function \f$ y=f(x) \f$ + \ingroup jkqtplotter_plots + + This class implements an intelligent plotting algorithm for functions. It starts by sampling + the function at minSamples positions. Then each function interval is bisected recursively if + necessary. To do so the function is evaluated at the mid point and the slopes \f$ \alpha_{\mbox{left}} \f$ + and \f$ \alpha_{\mbox{right}} \f$ of the two linear segments are compared. the midpoint is added + to the graph if \f[ \left|\alpha_{\mbox{right}}-\alpha_{\mbox{left}}\right|>\mbox{slopeTolerance} \f] + In addition all sampling points except minimum and maximum are beeing shifted by a random fraction their + distance to the other points. This helps to prevent beats when sampling periodic functions. + + the following image + \image html plot_functionplots.png + */ +class LIB_EXPORT JKQTPxFunctionLineGraph: public JKQTPgraph { + 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$ */ + }; + + /** \brief class constructor */ + JKQTPxFunctionLineGraph(JKQtBasePlotter* parent=nullptr); + + /** \brief class constructor */ + JKQTPxFunctionLineGraph(JKQtPlotter* parent); + + /** \brief class destructor */ + virtual ~JKQTPxFunctionLineGraph(); + + /** \brief plots the graph to the plotter object specified as parent */ + virtual void draw(JKQTPEnhancedPainter& painter); + /** \brief plots a key marker inside the specified rectangle \a rect */ + virtual void drawKeyMarker(JKQTPEnhancedPainter& painter, QRectF& rect); + /** \brief returns the color to be used for the key label */ + virtual QColor getKeyLabelColor(); + + /** \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); + /** \brief get the maximum and minimum y-value of the graph + */ + virtual bool getYMinMax(double& miny, double& maxy, double& smallestGreaterZero); + + /** \brief clear the data sampled from the function. */ + void clearData(); + + JKQTPGET_SET_MACRO(QColor, color) + JKQTPGET_SET_MACRO(QColor, fillColor) + JKQTPGET_SET_MACRO(Qt::BrushStyle, fillStyle) + JKQTPGET_SET_MACRO(Qt::PenStyle, style) + JKQTPGET_SET_MACRO(double, lineWidth) + JKQTPGET_SET_MACRO(bool, drawLine) + + /** \brief sets the property plotFunction to the specified \a __value. + * + * \details Description of the parameter varname is:
\copybrief plotFunction.
+ * \see plotFunction for more information */ + virtual void set_plotFunction (jkqtpPlotFunctionType && __value); + /** \brief sets the property plotFunction to the specified \a __value. + * + * \details Description of the parameter varname is:
\copybrief plotFunction.
+ * \see plotFunction for more information */ + virtual void set_plotFunction (const jkqtpPlotFunctionType & __value); + /** \brief returns the property varname. \see varname for more information */ \ + virtual jkqtpPlotFunctionType get_plotFunction () const; + + JKQTPGET_SET_MACRO_I(void*, params, clearData()) + /** \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!!!) */ + void set_params(const QVector& params); + /** \brief sets the params from a copy of the given array of length \a N */ + void set_copiedParams(const double* params, int N); + inline void set_paramsV(double p1) { + QVector p; + p< p; + p< p; + p< p; + p< p; + p< get_internalParams() const; + QVector get_internalErrorParams() const; + JKQTPGET_SET_MACRO(unsigned int, minSamples) + JKQTPGET_SET_MACRO(unsigned int, maxRefinementDegree) + JKQTPGET_SET_MACRO(double, slopeTolerance) + JKQTPGET_SET_MACRO(double, minPixelPerSample) + JKQTPGET_SET_MACRO(bool, plotRefinement) + JKQTPGET_SET_MACRO(bool, displaySamplePoints) + JKQTPGET_SET_MACRO(bool, drawErrorPolygons) + JKQTPGET_SET_MACRO(bool, drawErrorLines) + /** \brief sets the property errorPlotFunction to the specified \a __value. + * + * \details Description of the parameter varname is:
\copybrief errorPlotFunction.
+ * \see errorPlotFunction for more information */ + virtual void set_errorPlotFunction (jkqtpPlotFunctionType && __value); + /** \brief sets the property errorPlotFunction to the specified \a __value. + * + * \details Description of the parameter varname is:
\copybrief errorPlotFunction.
+ * \see errorPlotFunction for more information */ + virtual void set_errorPlotFunction (const jkqtpPlotFunctionType & __value); + /** \brief returns the property varname. \see varname for more information */ \ + virtual jkqtpPlotFunctionType get_errorPlotFunction () const; + JKQTPGET_SET_MACRO(void*, errorParams) + /** \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 set_errorParams(const QVector& errorParams); + + JKQTPGET_SET_MACRO(int, parameterColumn) + JKQTPSET_CAST_MACRO(size_t, int, parameterColumn) + JKQTPGET_SET_MACRO(int, errorParameterColumn) + JKQTPSET_CAST_MACRO(size_t, int, errorParameterColumn) + + JKQTPGET_SET_MACRO(QColor, errorColor) + JKQTPGET_SET_MACRO(QColor, errorFillColor) + JKQTPGET_SET_MACRO(Qt::BrushStyle, errorFillStyle) + JKQTPGET_SET_MACRO(Qt::PenStyle, errorStyle) + JKQTPGET_SET_MACRO(double, errorLineWidth) + + /** \copydoc JKQTPgraph::usesColumn() */ + virtual bool usesColumn(int c); + + + /** \brief sets function to the given special function */ + void setSpecialFunction(SpecialFunction function); + protected: + /** \brief which plot style to use from the parent plotter (via JKQtPlotterBase::getPlotStyle() and JKQtPlotterBase::getNextStyle() ) */ + int parentPlotStyle; + + struct doublePair { + double x; + double f; + doublePair* next; + }; + /** \brief a linked list holding the datapoints \f$ \left(x, y=f(x, \vec{p})\right) \f$ to be plotted */ + doublePair* data; + + /** \brief fill the data array with data from the function plotFunction */ + virtual void createPlotData( bool collectParams=true); + + virtual void collectParameters(); + + void refine(doublePair* a, doublePair* b, unsigned int degree=0); + + /** \brief if set, the values from this datatsore column are used for the parameters \c p1 , \c p2 , \c p3 , ... of the plot function */ + int parameterColumn; + /** \brief if set, the values from this datatsore column are used for the parameters \c p1 , \c p2 , \c p3 , ... of the error plot function */ + int errorParameterColumn; + + /** \brief color of the graph */ + QColor color; + /** \brief color of the graph fill */ + QColor fillColor; + /** \brief linestyle of the graph lines */ + Qt::PenStyle style; + /** \brief width (pixels) of the graph */ + double lineWidth; + /** \brief fill style, if the curve should be filled */ + Qt::BrushStyle fillStyle; + /** \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 pointer to the parameters supplied to the plotting funtion */ + void* params; + /** \brief the minimum number of points to evaluate the function at */ + unsigned int minSamples; + /** \brief the maximum number of recursive refinement steps + * + * each step bisects the interval \f$ [a, b] \f$ into two halfes. So the maximum number + * of points plotted at all are thus: + * \f[ \mbox{minSamples} \cdot 2^{\mbox{maxRefinementDegree}} \f] + */ + unsigned int maxRefinementDegree; + /** \brief the tolerance for the difference of two subsequent slopes */ + double slopeTolerance; + /** \brief create one sample at least every \a minPixelPerSample pixels */ + double minPixelPerSample; + /** \brief switch on or off [default: on] the plot refinement algorithm */ + bool plotRefinement; + /** \brief if true [default: off] display the points where the function has been sampled */ + bool displaySamplePoints; + /** \brief indicates whether an error polygon should be drawn */ + bool drawErrorPolygons; + /** \brief indicates whether error lines should be drawn */ + bool drawErrorLines; + /** \brief this function calculates the error at a given position */ + jkqtpPlotFunctionType errorPlotFunction; + /** \brief 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; + + + QBrush getBrush(JKQTPEnhancedPainter& painter) const; + QPen getLinePen(JKQTPEnhancedPainter& painter) const; + + QBrush getErrorBrush(JKQTPEnhancedPainter& painter) const; + QPen getErrorLinePen(JKQTPEnhancedPainter &painter) const; + + QVector iparams, ierrorparams; +}; + +/*! \brief This implements line plots where the data is taken from a user supplied function \f$ x=f(y) \f$ + \ingroup jkqtplotter_plots + + */ +class LIB_EXPORT JKQTPyFunctionLineGraph: public JKQTPxFunctionLineGraph { + Q_OBJECT + public: + /** \brief class constructor */ + inline JKQTPyFunctionLineGraph(JKQtBasePlotter* parent=nullptr):JKQTPxFunctionLineGraph(parent) {} + /** \brief class constructor */ + inline JKQTPyFunctionLineGraph(JKQtPlotter* parent):JKQTPxFunctionLineGraph(parent) {} + + /** \brief plots the graph to the plotter object specified as parent */ + virtual void draw(JKQTPEnhancedPainter& painter); + protected: + + /** \brief fill the data array with data from the function plotFunction */ + virtual void createPlotData( bool collectParams=true); + +}; + + + + +#endif // jkqtpgraphsevaluatedfunction_H diff --git a/lib/jkqtplotter/jkqtpgraphsparsedfunction.cpp b/lib/jkqtplotter/jkqtpgraphsparsedfunction.cpp index 27b0bf01dc..cb222ca870 100644 --- a/lib/jkqtplotter/jkqtpgraphsparsedfunction.cpp +++ b/lib/jkqtplotter/jkqtpgraphsparsedfunction.cpp @@ -26,11 +26,11 @@ #include #include #include - +#include double JKQTPxParsedFunctionLineGraphFunction(double x, void* data) { - JKQTPxParsedFunctionLineGraphFunctionData* d=(JKQTPxParsedFunctionLineGraphFunctionData*)data; + JKQTPxParsedFunctionLineGraph::JKQTPxParsedFunctionLineGraphFunctionData* d=(JKQTPxParsedFunctionLineGraph::JKQTPxParsedFunctionLineGraphFunctionData*)data; if (d && d->parser && d->node) { try { d->parser->addVariableDouble("x", x); @@ -102,6 +102,14 @@ JKQTPxParsedFunctionLineGraph::~JKQTPxParsedFunctionLineGraph() delete efdata.parser; } +void JKQTPxParsedFunctionLineGraph::set_plotFunction(jkqtpPlotFunctionType &&f){ + JKQTPxFunctionLineGraph::set_plotFunction(std::move(f)); +} + +void JKQTPxParsedFunctionLineGraph::set_plotFunction(const jkqtpPlotFunctionType &f) { + JKQTPxFunctionLineGraph::set_plotFunction(f); +} + void JKQTPxParsedFunctionLineGraph::createPlotData(bool /*collectParams*/) { collectParameters(); diff --git a/lib/jkqtplotter/jkqtpgraphsparsedfunction.h b/lib/jkqtplotter/jkqtpgraphsparsedfunction.h index d07e20a7c5..fadbba4418 100644 --- a/lib/jkqtplotter/jkqtpgraphsparsedfunction.h +++ b/lib/jkqtplotter/jkqtpgraphsparsedfunction.h @@ -27,19 +27,13 @@ #include "jkqtplottertools/jkqtptools.h" #include "jkqtplottertools/jkqtpmathparser.h" #include "jkqtplottertools/jkqtp_imexport.h" -#include "jkqtplotter/jkqtpgraphsvaluatedfunction.h" +#include "jkqtplotter/jkqtpgraphsevaluatedfunction.h" // forward declarations class JKQtBasePlotter; class JKQtPlotter; -struct JKQTPxParsedFunctionLineGraphFunctionData { - JKQTPMathParser* parser; - JKQTPMathParser::jkmpNode* node; - int varcount; -}; - /*! \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_plots @@ -63,26 +57,34 @@ class LIB_EXPORT JKQTPxParsedFunctionLineGraph: public JKQTPxFunctionLineGraph { JKQTPGET_SET_MACRO(QList, parameters) JKQTPGET_SET_MACRO(QString, function) - JKQTPGET_SET_MACRO(int, parameterColumn) JKQTPGET_SET_MACRO(QList, errorParameters) JKQTPGET_SET_MACRO(QString, errorFunction) - JKQTPGET_SET_MACRO(int, errorParameterColumn) + + /** \brief INTERNAL data structure + * \internal + */ + struct JKQTPxParsedFunctionLineGraphFunctionData { + JKQTPMathParser* parser; + JKQTPMathParser::jkmpNode* node; + int varcount; + }; + protected: - - - /** \brief which plot style to use from the parent plotter (via JKQtPlotterBase::getPlotStyle() and JKQtPlotterBase::getNextStyle() ) */ + /** \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 values of the parameters \c p1 , \c p2 , \c p3 , ... */ QList parameters; JKQTPxParsedFunctionLineGraphFunctionData fdata; - int parameterColumn; + /** \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 values of the parameters \c p1 , \c p2 , \c p3 , ... for the error function*/ QList errorParameters; JKQTPxParsedFunctionLineGraphFunctionData efdata; - int errorParameterColumn; - JKQTPGET_SET_MACRO_I(jkqtpPlotFunctionType, plotFunction, clearData()) + virtual void set_plotFunction(jkqtpPlotFunctionType&& f); + virtual void set_plotFunction(const jkqtpPlotFunctionType& f); JKQTPGET_SET_MACRO_I(void*, params, clearData()) JKQTPGET_SET_MACRO(jkqtpPlotFunctionType, errorPlotFunction) JKQTPGET_SET_MACRO(void*, errorParams) diff --git a/lib/jkqtplottertools/jkqtpmathparser.cpp b/lib/jkqtplottertools/jkqtpmathparser.cpp index 1585026419..e154b751ad 100644 --- a/lib/jkqtplottertools/jkqtpmathparser.cpp +++ b/lib/jkqtplottertools/jkqtpmathparser.cpp @@ -1079,6 +1079,7 @@ JKQTPMathParser::jkmpTokenType JKQTPMathParser::getToken(){ // else program->putback(ch1); jkmpError("undefined operator '&'; Did you mean LOGICAL_AND ('&&' / 'and')?"); + break; } case '|':{ char ch1=0; @@ -1087,6 +1088,7 @@ JKQTPMathParser::jkmpTokenType JKQTPMathParser::getToken(){ // else program->putback(ch1); jkmpError("undefined operator '|'; Did you mean LOGICAL_OR ('||' / 'or')?"); + break; } case '=':{ char ch1=0; diff --git a/screenshots/jkqtplotter_simpletest_functionplot.png b/screenshots/jkqtplotter_simpletest_functionplot.png new file mode 100644 index 0000000000000000000000000000000000000000..c01485943f1923a13b24582615449a758799a770 GIT binary patch literal 90967 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 literal 0 HcmV?d00001 diff --git a/screenshots/jkqtplotter_simpletest_parsedfunctionplot.png b/screenshots/jkqtplotter_simpletest_parsedfunctionplot.png new file mode 100644 index 0000000000000000000000000000000000000000..6bc3a9d59a0bce0afbdb857f8cf33d1b285bc15c GIT binary patch literal 37281 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 Ef^RrccK`qY literal 0 HcmV?d00001 diff --git a/test/simpletest_functionplot/README.md b/test/simpletest_functionplot/README.md new file mode 100644 index 0000000000..5bcd1244f3 --- /dev/null +++ b/test/simpletest_functionplot/README.md @@ -0,0 +1,96 @@ +[Back to JKQTPlotter main page](https://github.com/jkriege2/JKQtPlotter/) + +# JKQtPlotter + +## Plotting Mathematical Functions as Line Graphs +This project (see `./test/simpletest_functionplot/`) demonstrates how to plot mathematical functions as line graphs. The functions may be defined as static C functions, C++ functors or c++ inline functions. See [test/simpletest_parsedfunctionplot](https://github.com/jkriege2/JKQtPlotter/tree/master/test/simpletest_parsedfunctionplot) for an example of how to use an internal equation parser provided with JKQtPlotter instead of directly defining functions. + +The first example shows how to plot a C++ inline function: +```c++ + JKQTPxFunctionLineGraph* func1=new JKQTPxFunctionLineGraph(plot); + func1->set_plotFunction([](double x, void* /*params*/) { return 0.2*x*x-0.015*x*x*x; }); + func1->set_title("C++-inline function $0.2x^2-0.015x^3$"); + plot->addGraph(func1); +``` + +In any such plot function, you can also use parameters, provided via the second parameter. Usually these are "internal parameters", defined by `func2->set_paramsV(p0, p1, ...)`: +```c++ + JKQTPxFunctionLineGraph* func2=new JKQTPxFunctionLineGraph(plot); + func2->set_plotFunction([](double x, void* params) { + QVector* p=static_cast*>(params); + return p->at(0)*sin(2.0*M_PI*x*p->at(1)); + }); + // here we set the parameters p0, p1 + func2->set_paramsV(5, 0.2); + func2->set_title("C++-inline function with int. params $p_0\\cdot\\sin(x*2.0*\\pi\\cdot p_1)$"); + plot->addGraph(func2); +``` + +... but generally any pointer can be used as parameter (the set by `set_parameter(static_cast(myDataObject))`): +```c++ + JKQTPxFunctionLineGraph* func3=new JKQTPxFunctionLineGraph(plot); + func3->set_plotFunction([](double x, void* params) { + QMap* p=static_cast*>(params); + return p->value("amplitude")*sin(2.0*M_PI*x*p->value("frequency")); + }); + // here we set the parameters p0, p1 + QMap params3; + params3["amplitude"]=-3; + params3["frequency"]=0.3; + func3->set_params(¶ms3); + func3->set_title("C++-inline function with ext. params $p_0\\cdot\\sin(x*2.0*\\pi\\cdot p_1)$"); + plot->addGraph(func3); +``` + +You can also use C++ functors (or function objects): +```c++ + struct SincSqr { + public: + inline SincSqr(double amplitude): a(amplitude) {} + inline double operator()(double x, void* /*params*/) { + return a*sin(x)*sin(x)/x/x; + } + private: + double a; + }; + + // ... + + JKQTPxFunctionLineGraph* func4=new JKQTPxFunctionLineGraph(plot); + func4->set_plotFunction(SincSqr(-8)); + func4->set_title("C++ functor $-8*\\sin^2(x)/x^2$"); + plot->addGraph(func4); +``` + +... or simple static C functions: +```c++ + double sinc(double x, void* /*params*/) { + return 10.0*sin(x)/x; + } + + // ... + + JKQTPxFunctionLineGraph* func5=new JKQTPxFunctionLineGraph(plot); + func5->set_plotFunction(&sinc); + func5->set_title("static C function $10*\\sin(x)/x$"); + plot->addGraph(func5); +``` + +Finally `JKQTPxFunctionLineGraph` provides a small set of special functions (polynomial, exponential, ...), which draw their parameters from the internal or external parameters: +```c++ + JKQTPxFunctionLineGraph* func6=new JKQTPxFunctionLineGraph(plot); + func6->setSpecialFunction(JKQTPxFunctionLineGraph::Line); + // here we set offset and slope of the line + func6->set_paramsV(-1,1.5); + func6->set_title("special function: linear"); + plot->addGraph(func6); +``` + + + +This code snippets above result in a plot like this: + +![jkqtplotter_simpletest_functionplot](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_functionplot.png) + + +[Back to JKQTPlotter main page](https://github.com/jkriege2/JKQtPlotter/) \ No newline at end of file diff --git a/test/simpletest_functionplot/jkqtplotter_simpletest_functionplot.cpp b/test/simpletest_functionplot/jkqtplotter_simpletest_functionplot.cpp new file mode 100644 index 0000000000..89d55aef08 --- /dev/null +++ b/test/simpletest_functionplot/jkqtplotter_simpletest_functionplot.cpp @@ -0,0 +1,105 @@ +#include +#include +#include +#include "jkqtplotter/jkqtplotter.h" +#include "jkqtplotter/jkqtpgraphsevaluatedfunction.h" + +double sinc(double x, void* params) { + return 10.0*sin(x)/x; +} + +struct SincSqr { +public: + inline SincSqr(double amplitude): a(amplitude) {} + inline double operator()(double x, void* params) { + return a*sin(x)*sin(x)/x/x; + } +private: + double a; +}; + +int main(int argc, char* argv[]) +{ + QApplication app(argc, argv); + + // 1. create a window that conatins a line-edit to edit a function + // and a JKQtPlotter to display the function, combine everything in a layout + QWidget mainWin; + JKQtPlotter* plot=new JKQtPlotter(&mainWin); + QVBoxLayout* layout=new QVBoxLayout; + mainWin.setLayout(layout); + layout->addWidget(plot); + + // 2. now we add a JKQTPxFunctionLineGraph object, which will draw a simple function + // the function is defined as C++ inline function + JKQTPxFunctionLineGraph* func1=new JKQTPxFunctionLineGraph(plot); + func1->set_plotFunction([](double x, void* /*params*/) { return 0.2*x*x-0.015*x*x*x; }); + func1->set_title("C++-inline function $0.2x^2-0.015x^3$"); + plot->addGraph(func1); + + // 3. now we add a JKQTPxFunctionLineGraph object, which will draw a simple function + // the function is again defined as C++ inline function, but now uses internal + // parameters (handed over to the function as a pointer to QVector + JKQTPxFunctionLineGraph* func2=new JKQTPxFunctionLineGraph(plot); + func2->set_plotFunction([](double x, void* params) { + QVector* p=static_cast*>(params); + return p->at(0)*sin(2.0*M_PI*x*p->at(1)); + }); + // here we set the parameters p0, p1 + func2->set_paramsV(5, 0.2); + func2->set_title("C++-inline function with int. params $p_0\\cdot\\sin(x*2.0*\\pi\\cdot p_1)$"); + plot->addGraph(func2); + + // 4. now we add a JKQTPxFunctionLineGraph object, which will draw a simple function + // the function is again defined as C++ inline function, but now uses external + // parameters, which may have any type (here QMapset_plotFunction([](double x, void* params) { + QMap* p=static_cast*>(params); + return p->value("amplitude")*sin(2.0*M_PI*x*p->value("frequency")); + }); + // here we set the parameters p0, p1 + QMap params3; + params3["amplitude"]=-3; + params3["frequency"]=0.3; + func3->set_params(¶ms3); + func3->set_title("C++-inline function with ext. params $p_0\\cdot\\sin(x*2.0*\\pi\\cdot p_1)$"); + plot->addGraph(func3); + + // 5. of course the function may also be any C+ funtor object: + JKQTPxFunctionLineGraph* func4=new JKQTPxFunctionLineGraph(plot); + func4->set_plotFunction(SincSqr(-8)); + func4->set_title("C++ functor $-8*\\sin^2(x)/x^2$"); + plot->addGraph(func4); + + + // 6. now we use a JKQTPxFunctionLineGraph to draw a static C function + JKQTPxFunctionLineGraph* func5=new JKQTPxFunctionLineGraph(plot); + func5->set_plotFunction(&sinc); + func5->set_title("static C function $10*\\sin(x)/x$"); + plot->addGraph(func5); + + // 6. finally JKQTPxFunctionLineGraph defines a small set of common functions + JKQTPxFunctionLineGraph* func6=new JKQTPxFunctionLineGraph(plot); + func6->setSpecialFunction(JKQTPxFunctionLineGraph::Line); + // here we set offset and slope of the line + func6->set_paramsV(-1,1.5); + func6->set_title("special function: linear"); + plot->addGraph(func6); + + + // 8. set some axis properties (we use LaTeX for nice equation rendering) + plot->getXAxis()->set_axisLabel(QObject::tr("x-axis")); + plot->getYAxis()->set_axisLabel(QObject::tr("y-axis")); + plot->get_plotter()->set_keyPosition(JKQTPkeyOutsideBottomLeft); + + + // 4. scale the plot so the graph is contained + plot->setXY(-10,10,-10,10); + + // show window and make it a decent size + mainWin.show(); + mainWin.resize(800,800); + + return app.exec(); +} diff --git a/test/simpletest_functionplot/jkqtplotter_simpletest_functionplot.pro b/test/simpletest_functionplot/jkqtplotter_simpletest_functionplot.pro new file mode 100644 index 0000000000..c98b11696e --- /dev/null +++ b/test/simpletest_functionplot/jkqtplotter_simpletest_functionplot.pro @@ -0,0 +1,23 @@ +# source code for this simple demo +SOURCES = jkqtplotter_simpletest_functionplot.cpp + +# configure Qt +CONFIG += qt +QT += core gui xml svg +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport + +# output executable name +TARGET = jkqtplotter_simpletest_functionplot + + +# include JKQtPlotter source code +DEPENDPATH += . ../../lib +INCLUDEPATH += ../../lib +CONFIG (debug, debug|release):LIBS += -L../../lib/debug -ljkqtplotterlib +CONFIG (release):LIBS += -L../../lib/release -ljkqtplotterlib + +win32-msvc*: DEFINES += _USE_MATH_DEFINES + +# here you can activate some debug options +#DEFINES += SHOW_JKQTPLOTTER_DEBUG +#DEFINES += JKQTBP_AUTOTIMER diff --git a/test/simpletest_functionplot/jkqtplotter_simpletest_functionplot_and_lib.pro b/test/simpletest_functionplot/jkqtplotter_simpletest_functionplot_and_lib.pro new file mode 100644 index 0000000000..8f6f90a4d6 --- /dev/null +++ b/test/simpletest_functionplot/jkqtplotter_simpletest_functionplot_and_lib.pro @@ -0,0 +1,8 @@ +TEMPLATE = subdirs + +SUBDIRS += jkqtplotterlib jkqtplotter_simpletest_functionplot + +jkqtplotterlib.file = ../../lib/jkqtplotterlib.pro + +jkqtplotter_simpletest_functionplot.file=$$PWD/jkqtplotter_simpletest_functionplot.pro +jkqtplotter_simpletest_functionplot.depends = jkqtplotterlib diff --git a/test/simpletest_parsedfunctionplot/README.md b/test/simpletest_parsedfunctionplot/README.md new file mode 100644 index 0000000000..724cffb352 --- /dev/null +++ b/test/simpletest_parsedfunctionplot/README.md @@ -0,0 +1,53 @@ +[Back to JKQTPlotter main page](https://github.com/jkriege2/JKQtPlotter/) + +# JKQtPlotter + +## Plotting Parsed Mathematical Functions as Line Graphs +This project (see `./test/simpletest_parsedfunctionplot/`) demonstrates how to plot mathematical functions as line graphs. The functions are defined as strings that will be evaluated with the equation parser, integrated into JKQtPlotter. + +Adding an evaluated funtion to a graph is very simple: +```c++ + JKQTPxParsedFunctionLineGraph* parsedFunc=new JKQTPxParsedFunctionLineGraph(plot); + parsedFunc->set_function("sin(x*8)*exp(-x/4)"); + parsedFunc->set_title("user function"); +``` +As you can see a graph of the type `JKQTPxParsedFunctionLineGraph` is used, which plots a function that depends on the variable `x`. The given function is parsed and evaluated (see [`lib/jkqtplottertools/jkqtpmathparser.h`](https://github.com/jkriege2/JKQtPlotter/blob/master/lib/jkqtplottertools/jkqtpmathparser.h) for details on the features of the math parser). An intelligent drawing algorithm chooses the number of control points for drawing a smooth graph, with sufficient amount of details, by evaluating locally the slope of the function. + +In the example in [`test/simpletest_parsedfunctionplot/simpletest_parsedfunctionplot.cpp`](https://github.com/jkriege2/JKQtPlotter/blob/master/test/simpletest_parsedfunctionplot/simpletest_parsedfunctionplot.cpp) we do not simply set a fixed function, but add a `QLineEdit` which allows to edit the function and redraws it, once ENTER is pressed: +```c++ + JKQtPlotter* plot=new JKQtPlotter(&mainWin); + QLineEdit* edit=new QLineEdit(&mainWin); + edit->setToolTip("enter a function in dependence of the variable x and press ENTER to update the graph"); + + // ... + + + // 2. now we add a JKQTPxParsedFunctionLineGraph object, which will draw the function from + // the line edit + JKQTPxParsedFunctionLineGraph* parsedFunc=new JKQTPxParsedFunctionLineGraph(plot); + plot->addGraph(parsedFunc); + // finally we connect the line edit with the graph, whenever RETURN is pressed, + // the graph is updated: + auto updateGraphFunctor= + [=]() { + parsedFunc->set_title("user function: \\verb{"+edit->text()+"}"); + parsedFunc->set_function(edit->text()); + plot->update_plot(); + }; + QObject::connect(edit, &QLineEdit::returnPressed, updateGraphFunctor); + QObject::connect(edit, &QLineEdit::editingFinished, updateGraphFunctor); + edit->setText("sin(x*8)*exp(-x/4)"); + updateGraphFunctor(); +``` + + +This code snippet results in a plot like this: + +![jkqtplotter_simpletest_parsedfunctionplot](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_parsedfunctionplot.png) + +the adaptive capabilities of the rendering algorithm can be seen, when plotting e.g. `2/x`, which is drawn smoothely, even around the undefined value at `x=0`: + +![jkqtplotter_simpletest_parsedfunctionplot_2overx.png](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_parsedfunctionplot_2overx.png.png) + + +[Back to JKQTPlotter main page](https://github.com/jkriege2/JKQtPlotter/) \ No newline at end of file diff --git a/test/simpletest_parsedfunctionplot/jkqtplotter_simpletest_parsedfunctionplot.cpp b/test/simpletest_parsedfunctionplot/jkqtplotter_simpletest_parsedfunctionplot.cpp new file mode 100644 index 0000000000..04daf1cbb6 --- /dev/null +++ b/test/simpletest_parsedfunctionplot/jkqtplotter_simpletest_parsedfunctionplot.cpp @@ -0,0 +1,54 @@ +#include +#include +#include "jkqtplotter/jkqtplotter.h" +#include "jkqtplotter/jkqtpgraphsparsedfunction.h" + + + +int main(int argc, char* argv[]) +{ + QApplication app(argc, argv); + + // 1. create a window that conatins a line-edit to edit a function + // and a JKQtPlotter to display the function, combine everything in a layout + QWidget mainWin; + QLineEdit* edit=new QLineEdit(&mainWin); + edit->setToolTip("enter a function in dependence of the variable x and press ENTER to update the graph"); + JKQtPlotter* plot=new JKQtPlotter(&mainWin); + QVBoxLayout* layout=new QVBoxLayout; + mainWin.setLayout(layout); + layout->addWidget(edit); + layout->addWidget(plot); + + // 2. now we add a JKQTPxParsedFunctionLineGraph object, which will draw the function from + // the line edit + JKQTPxParsedFunctionLineGraph* parsedFunc=new JKQTPxParsedFunctionLineGraph(plot); + plot->addGraph(parsedFunc); + // finally we connect the line edit with the graph, whenever RETURN is pressed, + // the graph is updated: + auto updateGraphFunctor= + [=]() { + parsedFunc->set_title("user function: \\verb{"+edit->text()+"}"); + parsedFunc->set_function(edit->text()); + plot->update_plot(); + }; + QObject::connect(edit, &QLineEdit::returnPressed, updateGraphFunctor); + QObject::connect(edit, &QLineEdit::editingFinished, updateGraphFunctor); + edit->setText("sin(x*8)*exp(-x/4)"); + updateGraphFunctor(); + + + // 3. set some axis properties (we use LaTeX for nice equation rendering) + plot->getXAxis()->set_axisLabel(QObject::tr("x-axis")); + plot->getYAxis()->set_axisLabel(QObject::tr("y-axis")); + + + // 4. scale the plot so the graph is contained + plot->setXY(-10,10,-10,10); + + // show window and make it a decent size + mainWin.show(); + mainWin.resize(600,400); + + return app.exec(); +} diff --git a/test/simpletest_parsedfunctionplot/jkqtplotter_simpletest_parsedfunctionplot.pro b/test/simpletest_parsedfunctionplot/jkqtplotter_simpletest_parsedfunctionplot.pro new file mode 100644 index 0000000000..89c16689ee --- /dev/null +++ b/test/simpletest_parsedfunctionplot/jkqtplotter_simpletest_parsedfunctionplot.pro @@ -0,0 +1,23 @@ +# source code for this simple demo +SOURCES = jkqtplotter_simpletest_parsedfunctionplot.cpp + +# configure Qt +CONFIG += qt +QT += core gui xml svg +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport + +# output executable name +TARGET = jkqtplotter_simpletest_parsedfunctionplot + + +# include JKQtPlotter source code +DEPENDPATH += . ../../lib +INCLUDEPATH += ../../lib +CONFIG (debug, debug|release):LIBS += -L../../lib/debug -ljkqtplotterlib +CONFIG (release):LIBS += -L../../lib/release -ljkqtplotterlib + +win32-msvc*: DEFINES += _USE_MATH_DEFINES + +# here you can activate some debug options +#DEFINES += SHOW_JKQTPLOTTER_DEBUG +#DEFINES += JKQTBP_AUTOTIMER diff --git a/test/simpletest_parsedfunctionplot/jkqtplotter_simpletest_parsedfunctionplot_and_lib.pro b/test/simpletest_parsedfunctionplot/jkqtplotter_simpletest_parsedfunctionplot_and_lib.pro new file mode 100644 index 0000000000..647ed2c747 --- /dev/null +++ b/test/simpletest_parsedfunctionplot/jkqtplotter_simpletest_parsedfunctionplot_and_lib.pro @@ -0,0 +1,8 @@ +TEMPLATE = subdirs + +SUBDIRS += jkqtplotterlib jkqtplotter_simpletest_parsedfunctionplot + +jkqtplotterlib.file = ../../lib/jkqtplotterlib.pro + +jkqtplotter_simpletest_parsedfunctionplot.file=$$PWD/jkqtplotter_simpletest_parsedfunctionplot.pro +jkqtplotter_simpletest_parsedfunctionplot.depends = jkqtplotterlib