Использование 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.