2013-10-09 104 views
3

所以我試圖寫一個三線性插值函數,但我有一些麻煩提出來。三線性插值

所以首先我們有一個一維插值:

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

你現在在xy和xz平面上有投影,所以這些平面的交點留下了一個自由度:在x方向。所以我想你應該'interpolate1D(s,t,x)'? –

+0

但我覺得我需要爲「立方體」的6個邊進行插值,然後我會有6個值,s,t,u,w,x,y讓它們調用它們。然後從那裏我仍然失去了... – user1855952

+0

我有點困惑你的方法。如果插入兩個二維矢量,難道你不期待一個二維矢量作爲結果嗎?在3D中,你會期望一個3D矢量作爲結果? –

回答

2

線性插值不在面上操作(不是每個超立方體都有面)。它在頂點上成對運行。

你能想到的ND插值爲具有兩個部分:

  1. 上對輸入頂點的一系列1D插值的。 (n-1)對來自第一部分的內插值進行D插值。

例如,2D插值是2對輸入頂點的1D插值,然後是2個結果的1D插值。 3D插值是在4對輸入頂點上進行1D插值,然後在4個結果上進行2D插值。 4D插值是在8對輸入頂點上進行1D插值,然後在8個結果上進行3D插值。基本上,第一部分將插值問題從nD簡化爲等價(n-1)D插值問題;第二部分執行該插值。

1

一個很好的源來了解三線性插值可以發現於: https://en.wikipedia.org/wiki/Trilinear_interpolation

它提到下列:

在實踐中,一個三線性插值是相同的2個雙線性 插補組合線性插值:

C = linear(bilinear(C_(000),C_(010),C_(100),C_(110)), 
      bilinear(C_(001),C_(011),C_(101),C_(111))) 
1

您的代碼有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()

  • 插值兩次被 「降維」(1D爲2D,2D對1D),使用相同變量(x代表1D,(x,y代表2D))
  • 使用剩餘變量(y代表2D,z代表3D)內插中間結果1D

另請注意 - 我們不知道您是如何放置v1到v8的。但是如果你做得對,這個功能將起作用。