三线插值

时间:2013-10-09 12:07:16

标签: algorithm math 3d interpolation linear

所以我正在尝试编写三线性插值函数,但是遇到它时遇到了一些麻烦。

首先我们有一维插值:

float interpolate1D(float v1, float v2, float x){
    return v1*(1-x) + v2*x;
}

然后2D插值:

float interpolate2D(float v1, float v2, float v3, float v4, float x, float y){

    float s = interpolate1D(v1, v2, x);
    float t = interpolate1D(v3, v4, x);
    return interpolate1D(s, t, y);
}

但是一旦它进入3D,事情会变得棘手。我无法弄清楚如何使用2D插值函数实现3D插补器。我不知道为什么我有这个心理僵尸,因为它应该只是一个简单的扩展,但我想所有不同的变量在起作用都会让我失望。所以我开始使用下面的功能,但它不完整,我需要帮助才能完成它。

float interpolate3D(v1, v2, v3, v4, v5, v6, v7, v8, float x, float y, float z){


     float s = interpolate2D(v1, v2, v3, v4, x, y);
     float t = interpolate2D(v5, v6, v7, v7, x, z);

     //What do I do next?
}

3 个答案:

答案 0 :(得分:4)

您的代码存在2个问题 - v7出现两次。

让我为你拼出来:

float interpolate3D(v1, v2, v3, v4, v5, v6, v7, v8, float x, float y, float z)
{
    float s = interpolate2D(v1, v2, v3, v4, x, y);
    float t = interpolate2D(v5, v6, v7, v8, x, y);
    return interpolate1D(s, t, z);
}

将此与interpolate2D()

进行比较
  • 通过“低维”(2D为1D,对于1D为2D)进行两次插值,使用相同的变量(x表示1D,(x,y)表示2D)
  • 使用剩余变量(对于2D为y,对于3D为z)
  • 插入中间结果1D

另请注意 - 我们不知道您如何将v1放置到v8。但是如果你正确地做到了,这个功能就可以了。

答案 1 :(得分:2)

线性插值不适用于面(不是每个超立方体都有面)。它成对地在顶点上运行。

您可以将nD插值视为包含两部分:

  1. 输入顶点对上的一系列1D插值。
  2. (n-1)对来自第一部分的插值进行D插值。
  3. 例如,2D插值是2对输入顶点上的1D插值,然后是2个结果的1D插值。 3D插值是4对输入顶点上的1D插值,然后是4个结果的2D插值。 4D插值是对8对输入顶点进行1D插值,然后对8个结果进行3D插值。

    基本上,第一部分将插值问题从nD减少到等效(n-1)D插值问题;第二部分执行插值。

答案 2 :(得分:1)

理解三线性插值的一个非常好的来源可以在以下位置找到: https://en.wikipedia.org/wiki/Trilinear_interpolation

它提到了以下内容:

  

实际上,三线性插值与两个双线性相同   插值结合线性插值:

C = linear(bilinear(C_(000),C_(010),C_(100),C_(110)),
           bilinear(C_(001),C_(011),C_(101),C_(111)))