所以我正在尝试编写三线性插值函数,但是遇到它时遇到了一些麻烦。
首先我们有一维插值:
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?
}
答案 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()
:
另请注意 - 我们不知道您如何将v1放置到v8。但是如果你正确地做到了,这个功能就可以了。
答案 1 :(得分:2)
线性插值不适用于面(不是每个超立方体都有面)。它成对地在顶点上运行。
您可以将nD插值视为包含两部分:
基本上,第一部分将插值问题从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)))