Требуется быстрый С++ qt/qwt разброс графика
У меня огромная - около 3 миллионов пар - массив двумерных точек, которые мне нужно визуализировать с разумной скоростью в приложении на основе Qt.
Я пробовал использовать QGraphicsScene, но очень медленно даже на 400000 примитивах, поэтому вместо этого я искал в qwt-библиотеку.
Он имеет пример скриншота примера фрагмента рисунка на его странице sf, который выглядит точно, что мне нужно, но я не могу найти ни одного фактического код, который может использоваться для этих данных, а также API в qwt docs - он упоминает только разные типы кривых.
Поэтому было бы неплохо получить некоторые указатели на примеры вариантов разброса и некоторые советы по его производительности.
Также приветствуются предложения для других С++ qt-совместимых графических библиотек, которые могут справиться с этим объемом данных.
Ответы
Ответ 1
График рассеяния содержится в примере "в реальном времени: то, что вы хотите, это класс IncrementalPlot
.
Я также предлагаю, чтобы рисовать все 3 миллиона очков не было разумно, поскольку современные экраны имеют всего около 2 миллионов пикселей:) Таким образом, кажется, что лучше упростить график заранее, объединив соседние точки в один с порогом, зависящим от коэффициент масштабирования.
Ответ 2
Как отметил Винус, создание диаграмм рассеяния с 3 миллионами точек, вероятно, не очень хорошая идея.
Я добился хорошей производительности, создавая графики 3D-рассеяния с 30 000 точками, используя OpenGL.
OpenGL работает быстро и хорошо интегрируется с Qt. Тем не менее, это API низкого уровня, который заставляет вас делать много утомительного кодирования.
VTK может быть другой опцией.
Ответ 3
MathGL является бесплатной (GPL) кросс-платформенной графической библиотекой. Он был написан на С++ и имеет виджет Qt. Кроме того, это довольно быстро, но 3 миллиона очков... для моего ноутбука требуется около 30 секунд.
Ответ 4
Вы предлагаете использовать OpenGL как @vines, и, в частности, использовать или отображать списки glGenList
или вершинные буферы. Несколько миллионов точек в качестве примитивных вершин не должно быть так сложно.