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

Внутри метода actionPerformed() необходимо иметь вызовы removeAll(), setBackground() и InitializeGame() внутри блока if, как я показал ниже:

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

public void actionPerformed(ActionEvent e)
{
  if (((JButton) e.getSource()).getText().equals("Click to Play")) {
    removeAll();
    setBackground(Color.pink);
    InitializeGame();
  }

  if ( e.getActionCommand().equals( "s1" ) )
  {
    ((JButton)e.getSource()).setText("X");
  }

  repaint();
}
7
задан Pyrolistical 3 February 2009 в 20:03
поделиться

3 ответа

Необходимо попробовать файл от Центрального MATLAB:

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);
4
ответ дан 7 December 2019 в 10:08
поделиться

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

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

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

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

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

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

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

0
ответ дан 7 December 2019 в 10:08
поделиться

Я не знаю, как Matlab делает это, но я запустил бы с Деревьев квадрантов.

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

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

2
ответ дан 7 December 2019 в 10:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: