用于三线性插值的Javascript函数

时间:2009-10-29 03:42:46

标签: javascript algorithm interpolation

所有

THINK 我正在寻找三线性插值函数。

以下是详细信息:

我有一个三维数据集:

  • 尺寸1从0到100变化,增量为5
  • 尺寸2从0到100变化,增量为5
  • 尺寸3从0到1变化,增量为0.1

所以,我总共有4851个值(21 x 21 x 11)。

如果我需要找到(10,25,0.3)的值 - 这很容易 - 我可以在三维数组中查找它。

但是,我需要能够提出最佳近似值,例如给定(17,48,0.73)的维度值。

所以,我认为我正在寻找的是一个三线性插值(虽然我肯定会欣赏任何有关更好方法的建议,或暗示我的错误主题共...)

快速谷歌搜索出现了这个公式:

Vxyz = 
V000(1-x)(1-y)(1-z) +
V100x(1-y)(1-z) +
V010(1-x)y(1-z) +
V001(1-x)(1-y)z +
V101x(1-y)z +
V011(1-x)yz +
V110xy(1-z) +
V111xyz 

这看起来像我正在寻找的,但我不确定x,y和z代表什么。如果我不得不猜测,x是一个比率 - 我的“目标”第一个维度值与我最近的两个值之间的距离,y是第二个维度的比率,z是第三个维度的比率。

当然,因为我真的不知道我在说什么,所以我不知道这是对还是错。

所以,理想情况下,我想要一些Javascript或伪代码来确切地说明如何实现这一点。

非常感谢提前!

1 个答案:

答案 0 :(得分:6)

您正在查看的代码是尝试使用数据集中的顶点对多维数据集的8个点进行加权平均,并将您尝试为其找到值的点包含在内。

p

// Find the x, y and z values of the 
// 8 vertices of the cube that surrounds the point
x0 = Math.floor(p.x / 5);
x1 = Math.floor(p.x / 5) + 1;

y0 = Math.floor(p.y / 5);
y1 = Math.floor(p.y / 5) + 1;

z0 = Math.floor(p.z / .1);
z1 = Math.floor(p.z / .1) + 1;

// Look up the values of the 8 points surrounding the cube
p000 = dataset[x0][y0][z0];
p001 = dataset[x0][y0][z1];
// ...

// Find the weights for each dimension
x = (x - x0) / 5;
y = (y - y0) / 5;
z = (z - z0) / .1;

// Compute the guess using the method you found
// ...