我正在尝试找到一些 Java lib,代码示例(或起点)来帮助我弄清楚如何使用权重插入2d点列表以生成插值水平曲线。
谷歌搜索我发现有several algorithms available这样做,我找到了一些有趣内容的explanations。我想尝试的第一个算法是反向距离加权插值。
但是有了这些信息,我有一些基本的怀疑:
要生成如下图所示的一张图片,我必须做一个像素矩阵(带有权重),插入数据,将像素组合在一起(按颜色范围)然后加入点确实绘制曲线并放置参考文字值如this?
如果我需要做这个像素矩阵,对于一个巨大的插值来说它会非常昂贵,那么我可以做更少的点并使用样条线加入然后创建颜色级别吗?
示例数据:
+-------------------+
| X | Y | WEIGHT|
+-------------------+
| 2 | 5 | 30 |
| 7 | 3 | 25 |
| 1 | 1 | 10 |
| 5 | 6 | 45 |
| 7 | 9 | 15 |
+-------------------+
示例规则:
示例结果:
示例数据,规则和结果不兼容,只是随机的例子来解释我的问题。
以下是我的最终测试课程:http://pastebin.com/nD6MT8eS
答案 0 :(得分: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变大,您可能希望查看更合理的数据结构来存储点。
答案 1 :(得分:2)
为了补充@ mo-seph和@Xipan-Xiao的答案,您可以查看jFreeChart项目中的NonGridContourDataset类,该类实现与功率算法的反距离。