【问题标题】:Interpolating between multiple Points在多个点之间进行插值
【发布时间】:2016-10-24 03:04:38
【问题描述】:

我在这里需要一些算法思路。我有一大组二维点的数据(约 100k 个条目)作为对象,第三个变量作为平面这一点的“值”。现在我想计算某个给定坐标处的插值点。

到目前为止,我唯一的想法是遍历整个数据集并收集与我要计算的点最近的 4 个点的列表,然后在它们之间进行插值。

如何在多个数据之间插入加权(在这种情况下按点的距离)?所以更接近十字架的点出现在结果中?


在这种情况下,您对如何在给定坐标处获取插值有任何其他想法吗?它应该是相对准确的(但不必是 100%)并且不应该花费很长时间来计算,因为这必须完成大约 10.000 次,我不希望用户等待太久。


关于数据:Points几乎在一个网格中,并且二维Points的值实际上是高度值,因此两个近点的值也几乎相等。

数据存储在HashMap<Vector2f, Float> 中,其中Vector2f 是一个由2 个浮点数组成的简单类。没有任何排序。

【问题讨论】:

  • 如果您要计算点,如何获得“与我要计算的点最近的 4 个点的列表”?您对计算的点有一个初始猜测,然后迭代地移动它吗?
  • 输出完全取决于使用的方法。这些点是否类似于双参数函数?该功能是否单调?价值观如何传播?这些是完全随机的吗?
  • 哦,我好像还不够清楚。我知道坐标。但是所有点都有第三个值,我想在我的已知坐标处计算第三个值(通过在其他点的值之间插值)
  • @CptBartender 这些点几乎在网格中并从输入文件中读取(因此它们后面没有函数)
  • 是的,但是这些值背后必须有某种意义......

标签: java math interpolation point


【解决方案1】:

这是一个不明显的问题。 3分要容易得多,4分你会遇到模棱两可的情况。想象一下(对于您的样本周围的点) ul 和 br 角的值为 1,而其他角的值为 5。它可以解释为高度为 1 的山谷穿过中心,高度为 5 的山脊去那里,或某种幻想样条鞍形。如果考虑到网格的不规则性,那么最近的 4 个点在样本的同一侧会变得更加有趣(所以你不能只选择 4 个最近的点,你需要找到 4 个边界点)。

3分情况请查看https://en.wikipedia.org/wiki/Barycentric_coordinate_system#Application:_Interpolation_on_a_triangular_unstructured_grid

对于规则网格上的 4 点情况,您可以使用https://en.wikipedia.org/wiki/Bilinear_interpolation 生成一种“公平”插值。

对于不规则网格上的 4 个点,您可以研究如下解决方案 http://www.ahinson.com/algorithms_general/Sections/InterpolationRegression/InterpolationIrregularBilinear.pdf 但要小心找到合适的边界点(正如我所提到的,找到最接近的点是行不通的)

【讨论】:

  • 谢谢,这些 wiki 链接看起来非常有用。我想我会尝试使用 3 点插值。您知道当点 X 不在 3 个最近点的三角形内时这是否也有效? (甚至在示例图像中似乎就是这种情况)
【解决方案2】:

看起来像Bilinear interpolation。有一些通用算法,如果您对数据有限制,您可以使用它们来简化算法。由于“这些点几乎在一个网格中”,我做出了它们的近似值(“它应该是相对准确的(但不必是 100%)并且不应该花费很长时间计算”)。

给定

  1. 2 float x, y 作为您要插值的点。
  2. 4 个Vector2f 类型的对象,命名为v1v4,并假设每个对象的坐标都可以通过v1.xv1.y 访问,并且它们大致位于网格上:
    @987654328 @
  3. 每个Vector2f的值被检索为float h1 = map.get(v1)h代表“高度”),那么你可以这样写:

float n1 = h1 * (v2.x - x) * (v2.y - y);
float n2 = h2 * (x - v1.x) * (v2.y - y);
float n3 = h3 * (v2.x - x) * (y - v1.y);
float n4 = h4 * (x - v1.x) * (y - v1.y);
float den = (v2.x - v1.x) * (v2.y - v1.y);
float height = (n1 + n2 + n3 + n4) / den;

作为旁注,您可能还想考虑让您的课程strictfp

【讨论】:

    猜你喜欢
    • 2018-06-27
    • 1970-01-01
    • 2023-04-11
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多