三线性插值

8

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

首先我们有一个一维插值:

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?
}

你现在在xyxz平面上有投影,因此这些平面的交点只留下一个自由度:在x方向上。所以我猜你应该使用interpolate1D(s, t, x) - Vincent van der Weele
但我觉得我需要对“立方体”的6个面进行插值,然后我会得到6个值,s,t,u,w,x,y。从那里开始,我仍然感到迷茫... - user1855952
我对你的方法有点困惑。如果你插值两个二维向量,难道不应该期望得到一个二维向量作为结果吗?而在三维中,你会期望得到一个三维向量作为结果吗? - Vincent van der Weele
3个回答

7

你的代码有两个问题——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)两次插值,使用相同的变量(1D为x,2D为(x,y))
  • 使用剩余变量(2D为y,3D为z)插值中间结果1D。
此外,请注意 - 我们不知道您如何放置v1到v8。 但是,如果您正确执行此操作,则此函数将起作用。

2
线性插值不适用于面(并非每个超立方体都有面)。它是对顶点进行操作,成对地进行插值。
你可以将nD插值分为两部分: 1. 对输入顶点对进行一系列的1D插值。 2. 对第一部分中插值后的值进行(n-1)D插值。
例如,2D插值是在2个输入顶点对上进行1D插值,然后在2个结果上进行1D插值。3D插值是在4个输入顶点对上进行1D插值,然后在4个结果上进行2D插值。4D插值是在8个输入顶点对上进行1D插值,然后在8个结果上进行3D插值。
基本上,第一部分将插值问题从nD降低到等效的(n-1)D插值问题;第二部分执行该插值。

-1
一个非常好的了解三线性插值的来源可以在以下链接中找到: https://en.wikipedia.org/wiki/Trilinear_interpolation 它提到了以下内容:

In practice, a trilinear interpolation is identical to two bilinear interpolation combined with a linear interpolation:

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

2
这正是OP已经做过的!难道你没看到吗? - Engineer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接