Как сказал @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")
соответственно.