Как точно построить большие векторы данных на всех уровнях масштабирования в реальном времени?

StackOverflow https://stackoverflow.com/questions/508666

Вопрос

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

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

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

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

Как Матлаб это делает?

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

Это было полезно?

Решение

Вам следует попробовать файл из 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);

Другие советы

Я не знаю, как это делает Matlab, но я бы начал с Четырехдеревья.

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top