在Android上创建交互式等高线图

时间:2011-01-12 11:27:19

标签: java android plot

我有2D数组强度形式的数据,应该绘制在等高线图中。最后,它应该看起来像一个地形图,轮廓线如下图所示: alt text

这个想法是典型的多点触控手势(用于缩放的捏合,用于移动的拖动)可用于导航等高线图。数据的最大大小应该在4k * 4k点左右,每4个字节大一点。

是否有一些我可以使用的绘图库,还是我必须从头开始?是否有一个易于实现的算法?

2 个答案:

答案 0 :(得分:2)

我不知道有任何针对Android的绘图库(或者Java的绘图库),但我确实知道一般情况下的绘图:

创建轮廓的简单算法是Marching Squares。行进方块从您的数据数组中创建多边形。在Java中应该有很多这种算法的例子(尝试Google Code Search,但在你使用之前读取许可证。)

如果你想放大远,你可能想要从这些多边形创建 bezier曲线来平滑它们,可以找到一个示例算法(代码应该很容易移植到Java){ {3}}

注意:如果要使用颜色填充轮廓,则应考虑使用片段着色器而不是创建多边形。将数据作为纹理发送到着色器,并使用强度为每个像素指定颜色。为此你应该知道一些OpenGL。

答案 1 :(得分:0)

正如@Markus Johnsson所说,可视化二维数据阵列的一种方法是使用Marching Squares算法。但在你的情况下,似乎你需要基于isolines而不是isobands(使用Markus提到的多边形)来实现它。

基于isolines的实现更容易从头开始编写。这主要是因为您必须检查给定值是否低于或高于特定的isovalue(在isoband实现中低于特定范围以下)。这仅导致在单个isocell中绘制的16种可能的线条配置(在isobands实现中与80多边形配置相比)。

通常需要在创建等高线图之前插入数据。一种方法是使用Bicubic Interpolation

我最近写了一个基于Marching Squares算法及其isoband变体的填充二维等高线图的简单实现。该实现还使用提到的双立方插值来平滑数据。你可以找到这个简单的包here。它是在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

您也可以考虑为Marching Squares算法的isolines变体重写org.contour2dplot.*

以下分别为Contour2DMapsetMapColorScale("Color") setMapColorScale("Monochromatic")的两个屏幕截图。

enter image description here enter image description here