全部,

我认为我在寻找用于Trilinear插值的函数。

详细信息如下:

我有一个三维数据集:

  • 维度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)的情况下,我需要能够得出最佳近似值。

    因此,我认为我正在寻找的是三线性插值法(尽管我一定会感谢任何关于更好方法的建议,或者暗示我完全在错误的话题上...)

    快速的Google搜索可以得出以下公式:
    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/

    10-13 00:58