我正在寻找一种从一些2D散乱数据中插值的方法.我有一个3d点代表我想要插入中间点的地形.对于输入(X,Y)坐标,我需要Z(高度)值.
维基百科上的这篇文章也可以帮助您理解我的愿望.在matlab中有一个名为triscateredinterp的库,我认为它可以满足我的需求.
在C++中实现这种插值的轻量级方法是什么?
我认为你不需要 3D 插值(triscateredinterp)。您拥有基于 2D 输入的数据;第三个维度是你的输出。如果我理解正确的话,你想提供一个二维点(原始点之间的某个点),并插入该值。
轻的?最近的邻居!; 然后双线性插值;然后是双三次(和其他)。第一个很简单,其他则需要越来越多的数学知识。
双线性:对于每个要插值的点,找到距离 X 和 Y 最近的 3 个点:
lat long Altitude
X1 Y1 A1
X2 Y2 A2
X3 Y3 A3
Run Code Online (Sandbox Code Playgroud)
制作这些矩阵:
X1 Y1 1 A1
X = X2 Y2 1 Y = A2
X3 Y3 1 A3
Run Code Online (Sandbox Code Playgroud)
B 是我们将为这三个最近的点计算的插值系数(并且可以重新用于该区域中的所有点)
B1
B = B2
B3
Run Code Online (Sandbox Code Playgroud)
矩阵方程为:X*B = Y
您可以使用蛮力:将两边乘以 XT: XT*X*B = XT*Y
取 XT*X 的倒数: B = (XT*X)^-1 *XT*Y。
是的 3x3 矩阵求逆。将其与 C++ 问题联系起来,您可以使用 Boost 进行矩阵运算。
这是另一个类似的 C++ 问题:Solving a system ofequationsprogrammable?
双线性技术可能出现的一个问题是,当您的插值点变得更接近一组不同的 3 个值时,您可能会出现一些跳跃(如何在鞍形配置中插值 4 个点?)