在多个点之间插值

时间:2016-06-22 09:11:38

标签: java math interpolation point

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

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

如何在多个数据之间插值加权(在这种情况下通过点的距离)?那么结果中更接近十字的点更多?

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

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

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

2 个答案:

答案 0 :(得分:3)

这是一个非显而易见的问题。对于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 但是要小心找到合适的边界点(正如我所提到的,找到最接近的边界并不起作用)

答案 1 :(得分:1)

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

给出

  1. 2 float x, y作为您想要插入的点。
  2. 类型Vector2f的4个对象v1v4,假设每个对象的坐标可以v1.xv1.y进行访问,并且它们是v1.x == v3.x, v2.x == v4.x, v1.y == v2.y, v3.y == v4.y大约在网格上:
    Vector2f
  3. 每个float h1 = map.get(v1)的值都被检索为hfloat 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; 代表“身高”),然后您可以写下这样的内容:
  4. strictfp

    作为旁注,您可能还需要考虑制作课程$extract = new LayerShifter\TLDExtract\Extract(); $result = $extract->parse('www.example.co.uk'); $result->getSuffix(); // will return (string) 'co.uk'