【问题标题】:Value interpolation in 2d from scattered data [closed]来自分散数据的 2d 值插值 [关闭]
【发布时间】:2013-12-27 08:46:36
【问题描述】:

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

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

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

【问题讨论】:

  • 您的数据高度是 2D 输入吗?它是在一个规则的网格上,还是分散的?
  • 我散布了 3D 点。我的数据是海拔高度。
  • 你想给出一个 2D 值并插入高度?
  • 你不需要 3D 插值,只需要 2D。我可以解释背后的数学原理,但担心因为它不是一个非常 C++ 的答案而被否决。
  • 我编辑了问题以删除对图书馆链接的明确请求。我相信它现在已经成为话题。

标签: c++ interpolation


【解决方案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 个点?)

【讨论】:

  • 感谢您的回答。我熟悉矩阵乘法和 C++ :) 我在这里有点困惑。计算向量 B 时如何处理? 您如何使用点的坐标进行插值以获得新值? 您的解决方案是否类似于在最近的 3 个点上拟合一个平面,然后与我们寻求的值相交的垂直线相交?跨度>
  • B 是解,公式中的系数适用于任何 X 和 Y 来找到 A。A = XB1 + YB2 + B3。这是与原始 3 点相交的平面的公式。
  • 正如你提到的,这个解决方案不是连续的,所以我不确定它对分散的点有什么好处。用包含该点的三角形的 3 个顶点替换最近的 3 个点,假设您对这些点进行了(例如 Delaunay)三角剖分,那么您可以进行连续插值,这会打开更多选项。
【解决方案2】:

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

【讨论】:

  • 链接不是答案。关于 SO 的答案预计是独立的。请review this meta question 并在您的答案中添加足够的细节,使其不完全依赖外部链接。
  • 好吧,我不介意提供更多细节,但我认为这不是问题所在。实际上,我的答案与其说是链接,不如说是“自然邻域插值”。此外,实际问题是关于找到一个提供该功能的 C++ 库,我的链接是一个确切的答案。
  • 叹气,我需要记住在做评论时阅读问题。图书馆建议与 SO 无关,我已投票结束该问题。如果您至少可以提供一些关于如何使用此库解决问题的示例代码,将会很有帮助。
  • 嗯,可以点击链接找到示例代码...
猜你喜欢
  • 2016-06-17
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
  • 2019-10-27
  • 2018-12-12
  • 2014-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多