Java 2D加权数据插值

Tia*_*ago 16 java algorithm interpolation

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

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

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

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

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

示例数据:

+-------------------+
|  X  |  Y  | WEIGHT|
+-------------------+
|  2  |  5  |   30  |
|  7  |  3  |   25  |
|  1  |  1  |   10  |
|  5  |  6  |   45  |
|  7  |  9  |   15  |
+-------------------+
Run Code Online (Sandbox Code Playgroud)

示例规则:

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

示例结果:

Shepard插值示例

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


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

mo-*_*eph 5

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

Map<Point,Double> points = new HashMap<Point,Double>();
points.put( new Point(2,5), 30 )
...
Run Code Online (Sandbox Code Playgroud)

然后,您创建一个图像,并为每个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) )
    }
Run Code Online (Sandbox Code Playgroud)

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

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