16

我正在尝试找到一些Java库、代码示例(或起点)来帮助我弄清楚如何插入具有权重的 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

4

3 回答 3

5

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

Map<Point,Double> points = new HashMap<Point,Double>();
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 变大,您可能需要查看更合理的数据结构来存储点。

于 2013-02-04T23:16:44.250 回答
2

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

于 2013-02-05T15:49:09.427 回答
1

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

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

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 );
    }
}

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

于 2013-01-15T18:10:26.787 回答