как рисовать поверхность между 2 пазухами - PullRequest
2 голосов
/ 20 февраля 2020

Я бы хотел нарисовать поверхность между двумя синусоидами. две кривые пазухи имеют одинаковое основание времени, это означает, что x первой точки моих двух синусов одинаковы также как и вторая точка ....

так как я могу это сделать? моя идея состоит в том, чтобы нарисовать связки линий между двумя точками синуса, но я не нашел функции в qwt, которая позволила бы мне рисовать линии между двумя точками, которые имеют одинаковые x и разные y.

, если у вас есть идея получше, я хотел бы послушать ее, и если кто-то уже сделал это, было бы идеально иметь идею

, вы можете найти небольшой пример того, что я хочу сделать ниже.

серая часть - это то, к чему я стремлюсь. спасибо всем за помощь

enter image description here

1 Ответ

1 голос
/ 22 февраля 2020

Вы можете использовать QwtPlotIntervalCurve:

#include <QtWidgets>

#include <qwt_plot.h>
#include <qwt_plot_curve.h>
#include <qwt_plot_intervalcurve.h>

#include <cmath>

static double f(double x, double A, double W, double B){
    return A * std::sin(W * x) + B;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    const double deltax = .1;
    const int size = 100;
    QVector<QwtIntervalSample> rangeData(size);
    QVector<QPointF> lowData(size);
    QVector<QPointF> upperData(size);

    for(int i=0; i <size; ++i){
        double x = deltax * i;
        double ylow = f(x, 1, 4, -10);
        double yupper = f(x, 1, 2, 10);
        lowData[i] = QPointF(x, ylow);
        upperData[i] = QPointF(x, yupper);
        rangeData[i] = QwtIntervalSample(x, QwtInterval(ylow, yupper));
    }

    QwtPlot plot;

    QColor bg(Qt::gray);
    bg.setAlpha(150);

    QwtPlotCurve lowcurve;
    lowcurve.setRenderHint( QwtPlotItem::RenderAntialiased );
    lowcurve.setPen(QPen(Qt::gray, 5));
    lowcurve.setSamples(lowData);
    lowcurve.attach(&plot);

    QwtPlotCurve uppercurve;
    uppercurve.setRenderHint( QwtPlotItem::RenderAntialiased );
    uppercurve.setPen(QPen(Qt::gray, 5));
    uppercurve.setSamples(upperData);
    uppercurve.attach(&plot);

    QwtPlotIntervalCurve curve;
    curve.setRenderHint( QwtPlotItem::RenderAntialiased );
    curve.setPen(Qt::white);
    curve.setBrush(bg);
    curve.setStyle(QwtPlotIntervalCurve::Tube);
    curve.setSamples( rangeData );
    curve.attach(&plot);

    plot.resize(640, 480);
    plot.show();

    return a.exec();
}

enter image description here

...