Как точно построить большие векторы данных на всех уровнях масштабирования в реальном времени? - PullRequest
7 голосов
/ 03 февраля 2009

У меня есть большие наборы данных (данные 10 Гц, то есть 864 тыс. Точек за 24 часа), которые мне нужно построить в режиме реального времени. Идея состоит в том, что пользователь может увеличивать и перемещаться в очень подробные диаграммы рассеяния.

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

Но я также не могу просто построить каждую n-ую точку, иначе я пропущу основные функции, такие как большие, но короткие шипы.

Матлаб делает все правильно. Вы можете присвоить ему 864 тыс. Векторов, заполненных нулями, и просто установить любую точку на 1, и она будет правильно отображаться в реальном времени с масштабированием и панорамированием.

Как это делает Matlab?

Моя целевая система - Java, поэтому я буду генерировать представления этого графика в Swing / Java2D.

Ответы [ 3 ]

4 голосов
/ 03 февраля 2009

Вы должны попробовать файл из MATLAB Central:

https://mathworks.com/matlabcentral/fileexchange/15850-dsplot-downsampled-plot

От автора:

Эта версия «сюжета» позволит вам визуализировать данные, которые имеют очень большое количество элементов. Печать большого набора данных делает вашу графику медленной, но в большинстве случаев вам не нужна вся информация, отображаемая на графике. На вашем экране столько пикселей, и ваши глаза не смогут обнаружить информацию, не зафиксированную на экране.

Эта функция будет отбирать данные и отображать только подмножество данных, тем самым улучшая требования к памяти. Когда сюжет увеличен, отображается больше информации. Проделана определенная работа, чтобы убедиться, что выбросы зафиксированы.

Синтаксис:

dsplot(x, y)  
dsplot(y)  
dsplot(x, y, numpoints)  

Пример:

x =linspace(0, 2*pi, 1000000);  
y1=sin(x)+.02*cos(200*x)+0.001*sin(2000*x)+0.0001*cos(20000*x);  
dsplot(x,y1);
2 голосов
/ 03 февраля 2009

Я не знаю, как это делает Matlab, но я бы начал с Quadtrees .

Сброс всех ваших точек данных в дерево квадрантов, затем для рендеринга с заданным уровнем масштабирования вы идете вниз по дереву квадрантов (начиная с областей, которые перекрывают то, что вы просматриваете), пока не достигнете областей, которые сопоставимы с размером пиксель. Вставьте пиксель в середине этой области.

добавлено: рисование в OpenGL / JOGL также поможет вам ускорить рисование. Особенно, если вы можете предсказать панорамирование и построить точки для отображения в списке отображения или чего-то подобного, чтобы вам не приходилось выполнять какую-либо работу ЦП для новых кадров.

0 голосов
/ 03 февраля 2009
Данные

10 Гц означают, что вам нужно отображать только 10 кадров в секунду. Это должно быть легко, поскольку многие игры достигают> 100 кадров в секунду с гораздо более сложной графикой.

Если вы отображаете 10 пикселей в секунду для каждой возможной точки данных, вы можете отображать данные за минуту, используя виджет шириной 600 пикселей. Если вы сохраните индекс 600-го до последнего образца, то будет легко нарисовать только самые последние данные.

Если у вас нет новой точки данных каждые 10 секунд, вам нужно найти способ вставить интерполированную точку данных. На ум приходят три варианта:

  1. Повторите последнюю точку данных.
  2. Вставить «пустую» точку данных. Это приведет к появлению пробелов на графике.
  3. Не обновляйте график, пока не прибудет следующая точка данных. Затем вставьте все пиксели, которые вы не рисовали одновременно, с линейной интерполяцией между точками данных.

Чтобы сделать анимацию плавной, используйте двойная буферизация . Если целевой язык поддерживает виджет canvas, он, вероятно, поддерживает двойную буферизацию.

При масштабировании у вас есть те же три варианта, что и выше, так как увеличенные точки данных не являются непрерывными, даже если исходные точки данных были.

Это может помочь для его реализации в Java.

...