Нужен быстрый c ++ qt / qwt точечный график - PullRequest
10 голосов
/ 07 июля 2011

У меня есть огромный - около 3 миллионов пар - массив двумерных точек, которые мне нужно отображать с разумной скоростью в приложении на основе Qt.

Я пытался использовать QGraphicsScene, но он очень медленный даже на 400000 примитивах, поэтому вместо этого я искал библиотеку qwt.

На его sf-странице показан пример скриншота примера рассеянного графика , который выглядит именно так, как мне нужно, но я не могу найти ни какой-либо реальный код, который можно использовать для этих данных, ни соответствующий API в qwt docs - упоминаются только разные типы кривых.

Так что было бы хорошо получить несколько указателей для примеров рассеянных графиков и несколько советов по их производительности. Также приветствуются предложения для других c ++ qt-совместимых графических библиотек, которые могут справиться с таким количеством данных.

Ответы [ 4 ]

16 голосов
/ 07 июля 2011

Точечный график содержится в примере "realtime" : вам нужен класс IncrementalPlot. Я бы также предположил, что рисовать все 3 миллиона точек нецелесообразно, поскольку современные экраны имеют только около 2 миллионов пикселей :) Таким образом, кажется, лучше заранее упростить график, объединив смежные точки в одну с порогом, зависящим от коэффициент увеличения.

6 голосов
/ 07 июля 2011

Как указал Венс, создание точечных диаграмм с 3 миллионами точек, вероятно, не очень хорошая идея.

Я достиг хорошей производительности при создании трехмерных диаграмм рассеяния с 30 000 точками с использованием OpenGL. OpenGL быстр и хорошо интегрируется с Qt. Однако это низкоуровневый API, который заставляет вас делать утомительное кодирование.

VTK может быть другим вариантом.

3 голосов
/ 16 июля 2011

MathGL - бесплатная (GPL) библиотека кроссплатформенных графиков.Он был написан на C ++ и имеет виджет Qt.Кроме того, это довольно быстро, но 3 миллиона очков ... на моем ноутбуке требуется около 30 секунд.

1 голос
/ 06 ноября 2012

Вы бы предложили использовать OpenGL, как сказал @vines, и, в частности, использовать или отображать списки glGenList или буферы вершин.Несколько миллионов точек в качестве вершин примитивов не должны быть такими сложными.

...