Russian Qt Forum
Май 03, 2024, 16:19 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Водопадный спектр в Qwt - C++ Qt  (Прочитано 8907 раз)
dimbor
Гость
« : Июнь 06, 2017, 09:27 »

Доброго времени суток!

Возникла потребность создать водопадный график средствами Qwt, который бы выводил значения спектра в соотвествии ColorMap'у (как в SdrSharp к примеру). Я предположил, что для этого нужно завести массив переменных QwtPlotSpectrogram, и управлять ими соответственно. Однако я столкнулся с непонятками при работе с этим типом, в частности я не понимаю, как ему нужно подать данные для распределения в соответствии с ColorMap. У меня снаружи есть массив, в котором содержаться значения спектра, а в RasterData принимаются параметры x и y, которые, как я понял - координаты пикселей в виджете. Соответственно, если я буду посылать ему просто значения спектра, то он мне их не выведет, или выведет неправильно. Вопрос - каким образом "скормить" RasterData->value(x,y) массив значений спектра? Заранее спасибо. Вот как я пытаюсь это сделать:
Код:
class RasterData: public QwtRasterData
{
public:
    RasterData()
    {
    }
    virtual double value( double x, double y) const
    {
        return x;
    }
};
 
/***кусок кода***/
double waterfall_data_max = 0;
for (int i = 0; i < size; i++)
{
    if (waterfall_data_max < waterfall_data[i])
        waterfall_data_max = waterfall_data[i];
}
spectre_data->setInterval(Qt::XAxis, QwtInterval( 0.0, size ));
spectre_data->setInterval(Qt::YAxis, QwtInterval( 0.0, 100.0 ));
spectre_data->setInterval(Qt::ZAxis, QwtInterval( 0.0, waterfall_data_max));
               
for (int i = 0; i < size; i++)
{
    spectre_data->value(waterfall_data[i], i);
}
spectrogram->setData(spectre_data);
spectrogram->attach(ui.channel_1_waterfall_plot);
ui.channel_1_waterfall_plot->replot();
Записан
dimbor
Гость
« Ответ #1 : Июнь 06, 2017, 15:23 »

Данные удалось передать при помощи вот этого кода, переделав весь класс:
Код:
class RasterData: public QwtRasterData
{
test_app* m_app;
public:
//test_app ui;
RasterData(test_app* app)
{
m_app = app;
setInterval( Qt::XAxis, QwtInterval( 0.0, 1024.0 ) ); //отсчеты, график влево-вправо от - до + по Х
setInterval( Qt::YAxis, QwtInterval( 0.0, 50.0 ) ); //время, график вверх-вниз
setInterval( Qt::ZAxis, QwtInterval( 0.0, 10.0 ) );
}


virtual double value( double x, double y) const
{
test_app *mw = m_app;
if (mw)
{
for (int i = 0; i < 1024; i++)
{
return  mw->waterfall_data[i];
}
}


}
};
Однако вместо того, чтобы выдавать массив waterfall_data в виде градиента, он выдает почему-то только один цвет, судя по всему его последнего (или первого) элемента. Кто-нибудь сталкивался с подобным?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #2 : Июнь 06, 2017, 15:32 »

Посмотрите в примерах как там используется RasterData. Как пример называется не помню - помню был там комбо с параметрами вывода по ближайшему соседу и билинейной интерполяции. Возможно, поможет.
Записан
dimbor
Гость
« Ответ #3 : Июнь 06, 2017, 17:54 »

Да, при помощи примера исправил код, теперь работает хотя бы наполовину как надо:
Код:
virtual double value( double x, double y) const
{
test_app *mw = m_app;
if (mw)
{
int i = 0;
i = x;
return  mw->waterfall_data[i];
}
}

Однако вторая часть проблемы все ещё присутствует. Поскольку спектрограмма должна быть водопадной, то выводится она должна соответственно с 100 по 0 элемент y, смещая вниз каждую строку спектрограммы. При попытке опустить интервал вывода он заполняет весь график и потом просто перекрашивает его. Что нужно делать в таком случае? Заводить массив этих растердат? Более того, я не могу вывести строку на 100м элементе y, тоесть установка интервала даже в виде setInterval( Qt::YAxis, QwtInterval( 100.0, 99.0 ) ) не дает эффекта. Как поступать в таком случае?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 22.