Использование QwtPlotSpectrogram

Раньше мы научились использовать компонент QwtPlotSpectrocurve (здесь). У qwt предусмотрен альтернативный компонент, более удобный для визуализации аналитических функций. В этой заметке мы научимся использовать QwtPlotSpectrogram.

QwtPlotSpectrogram принимает данные у виде объекта, который есть наследником QwtRasterData. QwtRasterData - абстрактный класс, поэтому сначала создадим наследника:

#include <qwt_raster_data.h>
...

class RasterData: public QwtRasterData { public: RasterData() { setInterval( Qt::XAxis, QwtInterval( -3.0, 3.0 ) ); setInterval( Qt::YAxis, QwtInterval( -3.0, 3.0 ) ); setInterval( Qt::ZAxis, QwtInterval( 0.0, 10.0 ) ); }

virtual double value( double x, double y ) const { return ( cos(x*x) + y*y); } };

Здесь в конструкторе задаем и интервал отрисовки, метод value( double x, double y ) возвращает функцию z(x, y). В примере использована аналитическая функция, можно задавать набор значений и другими методами.

Дальше, как и в примере с QwtPlotSpectrocurve, необходимо задать карту цветов, которая задаст соответствие интервала значений цвету:

#include <qwt_color_map.h>

class ColorMap: public QwtLinearColorMap { public: ColorMap(): QwtLinearColorMap( Qt::darkCyan, Qt::red ) { addColorStop( 0.1, Qt::cyan ); addColorStop( 0.6, Qt::green ); addColorStop( 0.95, Qt::yellow ); } };

На этом, фактически, все, осталось только передать данные QwtPlotSpectrogram и отобразить результат на QwtPlot:
    QwtPlotSpectrogram *spectrogram = new QwtPlotSpectrogram;

spectrogram->setColorMap( new ColorMap() ); spectrogram->setData(new RasterData());

spectrogram->attach(ui->qwtPlot); ui->qwtPlot->replot();

Получаем спектрограмму:

spectrogramm Готовый пример можно скачать здесь: Spectrogramm.