Java 2D加权数据插值

我正在尝试找到一些Java lib,代码示例(或起点)来帮助我弄清楚如何用权重插入2d点列表以生成带有水平曲线的插值。

谷歌搜索我发现有几种算法可以做到这一点,我找到了一些有趣内容的解释 。 我想尝试的第一个算法是反距离加权插值。

但有了这些信息,我有一些基本的疑虑:

  • 要生成如下图所示的一张图片,我必须做一个像素矩阵(带有权重),插入数据,将像素组合在一起(按颜色范围)然后连接点确实绘制曲线并将参考文本值设置为这样 ?

  • 如果我需要做这个像素矩阵,对于一个巨大的插值来说它会非常昂贵,那么我可以做更少的点并使用样条曲线来加入然后创建颜色级别吗?

示例数据:

+-------------------+ | X | Y | WEIGHT| +-------------------+ | 2 | 5 | 30 | | 7 | 3 | 25 | | 1 | 1 | 10 | | 5 | 6 | 45 | | 7 | 9 | 15 | +-------------------+ 

示例规则:

  • 00-10之间的值: 蓝色
  • 10-20之间的价值: 绿色
  • 值在20-30之间: 黄色
  • 价值在30-40之间: 红色

示例结果:

Shepard插值示例

示例数据,规则和结果不兼容,只是随机的例子来解释我的问题。


这是我的最终测试课程: http : //pastebin.com/nD6MT8eS

假设您有一个可以使用的Point类(例如java.awt.Point),您可以将权重放入Map中:

 Map points = new HashMap(); points.put( new Point(2,5), 30 ) ... 

然后,您创建一个图像,并为每个x,y坐标找到最佳分数。 我假设得分是反距离乘以表中点的权重。 如果是这样,就像这样:

 image = createBitmap( width, height ) for( int x = 0; x < width; x++ ) for( int y = 0; y < height; y++ ) { double maxScore = -Double.MAX_VALUE for( Point p : points.keySet() ) { double score = points.get(p)/p.distance( x, y ) //Inverse distance times point weight minDist = Math.max( maxScore, score ) } image.setPixelColour( x, y, getColorForDistance( 1/minDist * points.get(p) ) } 

getColourForDistance(double dist)应该是显而易见的,尽管你必须设置正确的级别。 我假设createBitmap(width,height)是创建一个图像。 您正在制作什么样的图像取决于您的应用程序,以及它是否具有setPixelColour方法或类似方法。 积分等级的选择也取决于您的应用。

这不是优化的 - 它至少是O(x * y * p),其中p是点数。 如果p变大,您可能希望查看更合理的数据结构来存储点。

为了补充@ mo-seph和@Xipan-Xiao的答案,您可以从jFreeChart项目中查看NonGridContourDataset类,该类实现与功率算法的反距离。

不知道如何添加评论,所以我在这个答案区域添加我的想法。

至少你不需要“将像素组合在一起(通过颜色范围),然后连接点来绘制曲线”。 要生成您需要的图片,只需执行以下操作:

 picture = createBitmap( width, height ); for( int x = 0; x < width; ++ x ){ for( int y = 0;y < height; ++ y ){ double value = interpolate( x, y, inputs ); Color color = colorRangeOf( value ); picture.setPixel( x, y, color ); } } 

因此,在不创建像素矩阵的情况下创建图片,对颜色进行分组。 在指定图片的每个像素值之后,边界“曲线”将自动存在。