JKQtPlotter/examples/parametriccurve
2022-08-28 22:48:14 +02:00
..
CMakeLists.txt added more auto-generated screenshots 2022-08-26 22:32:48 +02:00
parametriccurve_and_lib.pro using CMake now to build examples 2019-06-20 22:24:47 +02:00
parametriccurve.cpp updated many documentation images to auto-generated ones 2022-08-28 22:48:14 +02:00
parametriccurve.pro using CMake now to build examples 2019-06-20 22:24:47 +02:00
README.md fixed rename setPalette()->setColorPalette() in examples 2020-09-11 15:28:56 +02:00

Example (JKQTPlotter): Plotting Parametric Curves

This project (see ./examples/parametriccurve/) demonstrates how to draw parametric curves [x,y]=f(t), using JKQTPXYLineGraph and JKQTPXYParametrizedScatterGraph, i.e. from a set of coordinates [xi,yi], for which the vector-values function f(t) is evaluated explicitly. If you are alloking for an example of implicit drawing by only defining the function f(t) and having JKQTPlotter evaluate it automatically and adaptively, you'll have to use JKQTPXYFunctionLineGraph, which is explained in ./examples/evalcurve

The source code of the main application can be found in parametriccurve.cpp. First, the parametric curve (here a logarithic spiral) is sampled into two columns containing the x- and y-values along the curve. In addition the radial distance from x=y=0 is added into a third column:

    QVector<double> X, Y, R;
    const int Ndata=500; // number of plot points in each curve
    const double phiMax=4.0*M_PI;
    const double a=1;
    const double k=0.2;
    for (double phi=-phiMax; phi<=phiMax; phi+=phiMax/double(Ndata)) {
        const double x=a*exp(k*phi)*cos(phi);
        const double y=a*exp(k*phi)*sin(phi);
        X<<x;
        Y<<y;
        R<<sqrt(x*x+y*y);
    }
    // and copy it to the datastore
    size_t columnX=ds->addCopiedColumn(X, "x");
    size_t columnY=ds->addCopiedColumn(Y, "y");
    size_t columnR=ds->addCopiedColumn(R, "r");

Then simples graph just uses the columns X and Y to plot the curve:

    JKQTPXYLineGraph* graph1=new JKQTPXYLineGraph(&plot);
    graph1->setXColumn(columnX);
    graph1->setYColumn(columnY);
    graph1->setDrawLine(true);
    graph1->setSymbolType(JKQTPNoSymbol);
    graph1->setTitle("one-colored spiral");
    plot.addGraph(graph1);

If you use JKQTPXYParametrizedScatterGraph instead of JKQTPXYLineGraph, you can also modify the color of the line-segments, connecting the datapoints:

    JKQTPXYParametrizedScatterGraph* graph2=new JKQTPXYParametrizedScatterGraph(&plot2);
    graph2->setXColumn(columnX);
    graph2->setYColumn(columnY);
    graph2->setColorColumn(columnR);
    graph2->setColorPalette(ette(JKQTPMathImageMATLAB);
    graph2->setSymbolType(JKQTPNoSymbol);
    graph2->setDrawLine(true);
    graph2->setTitle("colored spiral");
    graph2->getColorBarRightAxis()->setAxisLabel("color scale radius $r(\\phi)$");
    plot2.addGraph(graph2);

The result looks like this:

parametriccurve

... and with the line-color set by the radius:

parametriccurve