crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> С помощью чего лучше делать отрисовку графика на много точек?
Rocky
  опции профиля:
сообщение 18.8.2010, 10:31
Сообщение #1


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Всем привет! Есть порядка 20000 точек... Грубо говоря это сигнал с ПЗС-линеек. Нужно сделать что-то вроде осциллографа. Т.е. каждые например 200 мс перерисовывать спектр... Как лучше всего это сделать? Пробовал qwt. Вроде все норм, но вот при увеличении масштаба появляются просто дикие тормоза.... Вплоть до минуты думает.. Как с этим бороться непонятно (да и расчитан ли вообще Qwt на такие объемы). Посмотрел в сторону QGraphicsScene. С ним много непонятного... Т.е. как я понял нужно ручками как-то рисовать сетку (grid) например, подписывать значения сигналов на осях, учитывать масштаб и пр... Имхо тут лучше свой класс писать унаследовавшись от QWidget просто.. Или лучше использовать opengl вообще? Поделитесь опытом плиз, как лучше делать?

Спасибо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 18.8.2010, 10:41
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9655
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


я думаю, что графическое представление будет более тормозным, чем реализация своего виджета-отрисовщика. Хотя наверняка утверждать не стану.
С opengl не работал
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 18.8.2010, 10:44
Сообщение #3


фрилансер
******

Группа: Участник
Сообщений: 2877
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Rocky, на Qt такое не довелось ещё делать, а вот MFC( aka WinAPI) прекрасно справляется. То есть, хоть какая библиотека способна на такое, надо только всё правильно организовать :)

Расскажи, как ты делаешь - в словах, не кодом
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 18.8.2010, 11:18
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Я сделал пока через qwt. Сделал класс производный от QwtPlot. Расположил виджет на форме. В классе есть метод, через который передаются массивы (С-массивы - int*) X- и Y-значений. Потом заношу их так QwtPlotCurve::setRawData(m_dX1, m_dY1, nNumUsedPoints). Для навигации и масштабирования по спектру использую классы QwtPlotPicker QwtPlotPanner QwtPlotZoomer.

Свой класс писал на основе примеров, поставляемых с библиотекой. Вобщем-то все это работает на ура когда 50-100 точек.... А когда 20000 - вообще все виснет при увеличении масштаба... Видимо Qwt не предназначен для такого...

Свой виджет тоже где-то когда-то писал... Но насколько помню был затык как сделать правильно и грамотно масштабирование при выделении квадрата мышью.

А с QGraphicsScene вообще куча всего непонятного и ощущение что реально проще свой виджет писать чем использовать QGraphicsView. А именно:
1. Неясно как зафиксировать сетку (которая foreground grid) при масштабировании.
2. Неясно как сделать подписи на этой сетке.
3. Неясно как реализовать масштабирование не колесиком мыши - а при выделении квадрата мышью.
4. Неясно как сделать перемещение по графику (когда он не влезает в виджет) не с помощью скрол-баров, которые сами появляются, а опять-таки с помощью мыши....
5. Непонятно как правильно очищать сцену перед отрисовкой новой инфы...

Последнее получилось так
QGraphicsScene *pGraphicsScene = m_pSpectrPlot->scene();
delete pGraphicsScene;
pGraphicsScene = new QGraphicsScene;
m_pSpectrPlot->setScene(pGraphicsScene);

Правильно ли это? Фиг знает, по другому не нашел как....

Касаемо пунктов 1-4 видимо нужно делать сабклассинг и самому переписывать QPaintEvent.... Но неясно тогда в чем фишка QGraphicsView... Вобщем, вот такие мысли... Несколько дней думаю, пока ощущение что нужно либо самому писать виджет, производный от QWidget и в нем ловить QPaintEvent и все что нужно делать... Либо завязываться на OpenGL... Последнее интереснее конечно... Но вот интересно, можно ли 2D графики на нем рисовать.... Нужно разбираться вобщем...

Сообщение отредактировал Rocky - 18.8.2010, 11:21
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 18.8.2010, 12:30
Сообщение #5


фрилансер
******

Группа: Участник
Сообщений: 2877
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


нет, я ж говорю не про это. Расскажи алгоритм. На человечьих словах

Цитата(Rocky @ 18.8.2010, 14:18) *
1. Неясно как зафиксировать сетку (которая foreground grid) при масштабировании.
2. Неясно как сделать подписи на этой сетке.
3. Неясно как реализовать масштабирование не колесиком мыши - а при выделении квадрата мышью.
4. Неясно как сделать перемещение по графику (когда он не влезает в виджет) не с помощью скрол-баров, которые сами появляются, а опять-таки с помощью мыши....
5. Непонятно как правильно очищать сцену перед отрисовкой новой инфы...

Ну, тут "неясно" не означает, что невозможно. Може, и умеет ) А может и нет - ведь под всё универсально не сделаешь

У тебя основная задача - хранить массив точек, из них делать массив линий, рисовать этот массив
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 18.8.2010, 12:53
Сообщение #6


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Хм..... по-поводу qwt пока думал как словесно описать, вспомнил что есть пример realtime в котором задаешь количество точек для отрисовки..... Задал 30000 - вроде тормозов нет... Попробую покопать туда... Спасибо )) Потом отпишусь в чем косяк (если найду конечно)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 19.8.2010, 16:31
Сообщение #7


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


Цитата(Rocky @ 18.8.2010, 13:53) *
Но вот интересно, можно ли 2D графики на нем рисовать....

На OGL можно гораздо больше чем предоставляет стандарный QPainter. Вывести полилинию в 20к точек это вообще не задача.
Я решал твою задачу когда то, но делал все на WinAPI, ну и объемы данных измерялись гигабайтами. А вот если рисовать через стандартный Qpainter большое количество объектов или полилинии из огромного количества вершин дело гиблое, хотя 20к точек должен "тянуть"
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 20.8.2010, 13:18
Сообщение #8


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Вобщем в итоге на пока оставил qwt... После пары часов просмотра хидеров, сделал так:
m_pPlotCurve->setPaintAttribute(QwtPlotCurve::ClipPolygons);

Тормоза ушли =)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 24.4.2019, 1:06