我有2D数组强度形式的数据,应该绘制在等高线图中。最后,它应该看起来像一个地形图,轮廓线如下图所示:
这个想法是典型的多点触控手势(用于缩放的捏合,用于移动的拖动)可用于导航等高线图。数据的最大大小应该在4k * 4k点左右,每4个字节大一点。
是否有一些我可以使用的绘图库,还是我必须从头开始?是否有一个易于实现的算法?
答案 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.*
。
以下分别为Contour2DMap
和setMapColorScale("Color")
setMapColorScale("Monochromatic")
的两个屏幕截图。