crossplatform.ru

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


  Ответ в С помощью чего лучше делать отрисовку графика на много точек?
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Rocky Дата 20.8.2010, 13:18
  Вобщем в итоге на пока оставил qwt... После пары часов просмотра хидеров, сделал так:
m_pPlotCurve->setPaintAttribute(QwtPlotCurve::ClipPolygons);

Тормоза ушли =)
wiz29 Дата 19.8.2010, 16:31
 
Цитата(Rocky @ 18.8.2010, 13:53) *
Но вот интересно, можно ли 2D графики на нем рисовать....

На OGL можно гораздо больше чем предоставляет стандарный QPainter. Вывести полилинию в 20к точек это вообще не задача.
Я решал твою задачу когда то, но делал все на WinAPI, ну и объемы данных измерялись гигабайтами. А вот если рисовать через стандартный Qpainter большое количество объектов или полилинии из огромного количества вершин дело гиблое, хотя 20к точек должен "тянуть"
Rocky Дата 18.8.2010, 12:53
  Хм..... по-поводу qwt пока думал как словесно описать, вспомнил что есть пример realtime в котором задаешь количество точек для отрисовки..... Задал 30000 - вроде тормозов нет... Попробую покопать туда... Спасибо )) Потом отпишусь в чем косяк (если найду конечно)
Алексей1153 Дата 18.8.2010, 12:30
  нет, я ж говорю не про это. Расскажи алгоритм. На человечьих словах

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

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

У тебя основная задача - хранить массив точек, из них делать массив линий, рисовать этот массив
Rocky Дата 18.8.2010, 11:18
  Я сделал пока через 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 графики на нем рисовать.... Нужно разбираться вобщем...
Алексей1153 Дата 18.8.2010, 10:44
  Rocky, на Qt такое не довелось ещё делать, а вот MFC( aka WinAPI) прекрасно справляется. То есть, хоть какая библиотека способна на такое, надо только всё правильно организовать :)

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

Спасибо!
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 21:53