分散数据中2d的值插值

时间:2013-12-10 01:17:31

标签: c++ interpolation

我正在寻找一种从一些2D散乱数据中插值的方法。我有一个3d点代表我想要插入中间点的地形。对于输入(X,Y)坐标,我需要Z(高度)值。

This article on wikipedia也可以帮助您理解我的意愿。在matlab中有一个名为 triscateredinterp 的库,我认为它可以满足我的需求。

在C ++中实现此插值的轻量级方法是什么?

2 个答案:

答案 0 :(得分:1)

我认为你不需要3D插值(triscateredinterp)。您有基于2D输入的数据;第三个维度是你的输出。如果我理解正确,你想在2D中提供一个点(在原始点之间,并插值。

重量轻?最近的邻居!;那么双线性插值;然后是双立方(和其他)。第一个很简单,其他则需要越来越多的数学。

双线性:对于要插值的每个点,找到距离X和Y最近的3个点:

lat long Altitude
X1   Y1   A1
X2   Y2   A2
X3   Y3   A3

制作这些矩阵:

    X1   Y1   1                      A1
X = X2   Y2   1                  Y = A2
    X3   Y3   1                      A3

B是我们将为这三个最近点计算的插值系数(并且可以重复用于该区域中的所有点)

    B1
B = B2
    B3

矩阵方程为:X*B = Y

你可以使用强力: 将双方乘以XT:XT*X*B = XT*Y
取XT * X的倒数:B = (XT*X)^-1 *XT*Y

是3x3矩阵求逆。将此问题与C ++问题联系起来,您可以将Boost用于矩阵运算。

这是另一个类似的C ++问题:Solving a system of equations programmably?

双线性技术可能产生的一个问题是,当您的插值点变得更接近不同的3个值时,您可以得到一些跳跃(如何在鞍座配置中插入4个点?)

答案 1 :(得分:1)

散乱点的一个好方法是自然邻居插值。 您可以查看CGAL中可用的实现,例如:http://doc.cgal.org/latest/Interpolation/index.html