我正在寻找一种从一些2D散乱数据中插值的方法。我有一个3d点代表我想要插入中间点的地形。对于输入(X,Y)坐标,我需要Z(高度)值。
This article on wikipedia也可以帮助您理解我的意愿。在matlab中有一个名为 triscateredinterp 的库,我认为它可以满足我的需求。
在C ++中实现此插值的轻量级方法是什么?
答案 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