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

3 回答 3

7

您的代码有 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()

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

另请注意 - 我们不知道您如何放置 v1 到 v8。但如果你做得正确,这个功能就会起作用。

于 2017-05-23T09:01:16.363 回答
2

线性插值不适用于面(并非每个超立方体都有面)。它成对地对顶点进行操作。

您可以将 nD 插值视为具有两部分:

  1. 输入顶点对上的一系列一维插值。
  2. (n-1)D 对第一部分的插值进行插值。

例如,2D 插值是对 2 对输入顶点进行 1D 插值,然后对 2 个结果进行 1D 插值。3D 插值是对 4 对输入顶点进行 1D 插值,然后对 4 个结果进行 2D 插值。4D 插值是对 8 对输入顶点进行 1D 插值,然后对 8 个结果进行 3D 插值。

基本上,第一部分将插值问题从 nD 简化为等效的 (n-1)D 插值问题;第二部分执行该插值。

于 2013-10-09T14:08:55.880 回答
-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)))
于 2017-05-17T08:12:38.720 回答