<分区>
我正在寻找一种方法来从某些 2D 散点数据中插入值。我有一个代表地形的 3d 点,我想从中插入中间点。对于输入 (X,Y) 坐标,我需要 Z(高度)值。
This article on wikipedia也可以帮助你理解我的意愿。 matlab 中有一个名为 triscateredinterp 的库,我认为它可以满足我的需求。
在 C++ 中实现这种插值的轻量级方法是什么?
标签 c++ interpolation
<分区>
我正在寻找一种方法来从某些 2D 散点数据中插入值。我有一个代表地形的 3d 点,我想从中插入中间点。对于输入 (X,Y) 坐标,我需要 Z(高度)值。
This article on wikipedia也可以帮助你理解我的意愿。 matlab 中有一个名为 triscateredinterp 的库,我认为它可以满足我的需求。
在 C++ 中实现这种插值的轻量级方法是什么?
最佳答案
我认为您不需要 3D 插值 (triscateredinterp)。您有基于二维输入的数据;第三维是你的输出。如果我理解正确的话,您想提供一个 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 个点?)
关于c++ - 分散数据的二维值插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20484233/