用于三线性插值的 Javascript 函数

标签 javascript algorithm interpolation

全部,

认为我正在寻找一个用于三线性插值的函数。

详情如下:

我有一个三维数据集:

  • 维度 1 从 0 到 100 以 5 为增量变化
  • 维度 2 从 0 到 100 以 5 为增量变化
  • 维度 3 从 0 到 1 以 0.1 为增量变化

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

如果我需要找到 (10, 25, 0.3) 的值 - 这很简单 - 我可以在 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 或伪代码来准确显示如何完成此操作。

非常感谢!

最佳答案

您正在查看的代码试图对数据集中顶点的立方体的 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
// ...

关于用于三线性插值的 Javascript 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1641497/

相关文章:

javascript - 我想从 node.js javascript 调用一个用 "C"DLL 编写的函数?

python-3.x - 从月平均数据帧到插值的每日时间序列

基于信号延迟找出传感器相对位置的算法

c - BST 中的顺序后继者

r - 如何反向转换正常分数转换后的数据

kernel - 使用 OpenCL 内核的最近邻插值代码

Javascript 特殊字符验证

javascript - 如何在jsp中的警报/消息框中显示图像

javascript - 如何在滚动页面时卡住 div 面板到达窗口顶部

c# - 删除重复图像