三线插值

use*_*952 6 algorithm math 3d linear-interpolation

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

首先我们有一个插值:

float interpolate1D(float v1, float v2, float x){
    return v1*(1-x) + v2*x;
}
Run Code Online (Sandbox Code Playgroud)

然后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);
}
Run Code Online (Sandbox Code Playgroud)

但是一旦它进入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?
}
Run Code Online (Sandbox Code Playgroud)

Tom*_*dor 6

您的代码有两个问题 - 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);
}
Run Code Online (Sandbox Code Playgroud)

将此与interpolate2D()

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

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


Sne*_*tel 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 插值问题;第二部分执行插值。