2009-02-03 6 views
7

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

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

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

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

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

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

+0

Я не совсем понимаю, что вы здесь просите. Не могли бы вы добавить пример кода, как вы рисуете данные в MATLAB? – gnovice

+0

Является ли ваш вопрос вопросом Java или вопросом Matlab? –

+0

Мне интересно, как это делает Matlab, поэтому я воспроизвожу его на Java – Pyrolistical

ответ

4

Вы должны попробовать файл из 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

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

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

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

0

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

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

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

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

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

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

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

+0

Извините, когда я сказал «в реальном времени», я имел в виду, что за графиком должно произойти заговор, но данные статичны. – Pyrolistical