Создание интерактивных контурных сюжетов на Android - PullRequest
2 голосов
/ 12 января 2011

У меня есть данные в виде двумерного массива интенсивностей, которые должны быть нанесены на контурный график.В конце она должна выглядеть как топографическая карта с контурными линиями, подобными следующему изображению: alt text

Идея состоит в том, что типичные мультитач-жесты (масштабирование, перетаскивание для перемещения) могут использоваться для навигацииконтурный сюжет.Максимальный размер данных должен быть около 4k * 4k точек, каждый размером 4 байта.

Есть ли какая-нибудь библиотека для построения графиков, которую я могу использовать, или мне нужно начинать с нуля?Есть ли легко реализуемый алгоритм для этого?

Ответы [ 2 ]

2 голосов
/ 08 февраля 2011

Я не знаю каких-либо библиотек для Android (или Java), но я знаю кое-что о графике в целом:

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

Если вы хотите увеличить масштаб, возможно, вы захотите создать кривые Безье из этих многоугольников, чтобы сгладить их, можно найти пример алгоритма (с кодом, который должен быть легко перенесен на Java) здесь .

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

0 голосов
/ 21 марта 2016

Как сказал @Markus Johnsson, одним из способов визуализации двумерного массива данных является использование алгоритма Марширующих квадратов.Но в вашем случае, кажется, вам нужна его реализация на основе изолиний вместо изобанд (в которых используются многоугольники, о которых упоминал Маркус).

Реализация на основе изолиний прощенаписать это с нуля.Это происходит главным образом из-за того, что вам нужно проверять только то, находится ли данное значение ниже определенного значения или выше определенного значения (по сравнению с определенным диапазоном ниже-выше-выше при реализации isoband).Это приводит только к 16 возможным конфигурациям линий, нарисованных в одном изоэлементе (по сравнению с 80 конфигурациями полигонов в реализации изобанд).

Часто желательно интерполировать ваши данные перед их использованием при создании карты контуров.Один из способов сделать это - использовать Бикубическую интерполяцию .

Недавно я написал простую реализацию заполненного двухмерного контурного графика, основанного на алгоритме Марширующих квадратов и его варианте изобанды.,Эта реализация также использует упомянутую бикубическую интерполяцию для сглаживания данных.Вы можете найти этот простой пакет здесь .Он написан под лицензией GNU GPLv3 (или позже).Чтобы использовать его в своем проекте, вы должны скопировать и вставить org.contour2dplot.* в местоположение проекта.

Все, что вам нужно сделать, чтобы нарисовать контурную карту с использованием вышеупомянутого пакета, это подготовитьdouble[][] data и создайте Contour2DMap объект.Пример использования может выглядеть следующим образом:

// Specify in the constructor width and height of the contour map.
Contour2DMap contour2DMap = new Contour2DMap(600, 600);

// Specify size for the contour map container.
contour2DMap.setPrefSize(600, 600);

// Set data.
contour2DMap.setData(data);

// Set iso factor, which is a step between subsequent iso values.
contour2DMap.setIsoFactor(1.0);

// Set interpolation factor.
contour2DMap.setInterpolationFactor(10);

// Set contour map color scale - "Color" or "Monochromatic".
contour2DMap.setMapColorScale("Color");

// Draw all elements on the contour map.
contour2DMap.draw(); 

Contour2DMap объект наследуется от javafx.scene.layout.Pane, поэтому вы можете вложить его в другие javafx.scene.layout.* объекты, такие как BorderPane.

Чтобы сделать контурную карту интерактивной, вы можете рассмотреть возможность перезаписи javafx.scene.chart.Chart объекта и вложения Contour2DMap в нем.

Вы также можете рассмотреть возможность перезаписи org.contour2dplot.* для варианта изолиний алгоритма Маркирующих квадратов.

Ниже приведены два снимка экрана Contour2DMap для setMapColorScale("Color") и setMapColorScale("Monochromatic") соответственно.

enter image description here enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...