三线性插值(Trilinear Interpolation)详解
x
d
=
x
−
x
0
x
1
−
x
0
,
y
d
=
y
−
y
0
y
1
−
y
0
,
z
d
=
z
−
z
0
z
1
−
z
0
x_d=\frac{x-x_0}{x_1-x_0}, y_d=\frac{y-y_0}{y_1-y_0}, z_d=\frac{z-z0}{z_1-z_0}
xd=x1−x0x−x0,yd=y1−y0y−y0,zd=z1−z0z−z0
x0表示在x下方一个方格点,x1表示在x上方的一个方格点,对于y0、y1、z0、z1是同样的意思。
xd、yd、zd表示x、y、z在较小相关坐标的差值(这是维基百科中的解释)
首先,我们沿着x轴方向插值
c
00
=
V
[
x
0
,
y
0
,
z
0
]
(
1
−
x
d
)
+
V
[
x
1
,
y
0
,
z
0
]
x
d
c_{00}=V[x_0,y_0,z_0](1-x_d) + V[x_1,y_0,z_0]x_d
c00=V[x0,y0,z0](1−xd)+V[x1,y0,z0]xd
c
01
=
V
[
x
0
,
y
0
,
z
1
]
(
1
−
x
d
)
+
V
[
x
1
,
y
0
,
z
1
]
x
d
c_{01}=V[x_0,y_0,z_1](1-x_d) + V[x_1,y_0,z_1]x_d
c01=V[x0,y0,z1](1−xd)+V[x1,y0,z1]xd
c
10
=
V
[
x
0
,
y
1
,
z
0
]
(
1
−
x
d
)
+
V
[
x
1
,
y
1
,
z
0
]
x
d
c_{10}=V[x_0,y_1,z_0](1-x_d) + V[x_1,y_1,z_0]x_d
c10=V[x0,y1,z0](1−xd)+V[x1,y1,z0]xd
c
11
=
V
[
x
0
,
y
1
,
z
1
]
(
1
−
x
d
)
+
V
[
x
1
,
y
1
,
z
1
]
x
d
c_{11}=V[x_0,y_1,z_1](1-x_d) + V[x_1,y_1,z_1]x_d
c11=V[x0,y1,z1](1−xd)+V[x1,y1,z1]xd
V
[
x
0
,
y
0
,
z
0
]
V[x0,y0,z0]
V[x0,y0,z0]表示该函数在(x0,y0,z0)上的值, 然后再沿着y轴插值
c
0
=
c
00
(
1
−
y
d
)
+
c
10
y
d
c_0=c_{00}(1-y_d)+c_{10}y_d
c0=c00(1−yd)+c10yd
c
1
=
c
01
(
1
−
y
d
)
+
c
11
y
d
c_1=c_{01}(1-y_d)+c_{11}y_d
c1=c01(1−yd)+c11yd
最后再沿着z轴插值
c
=
c
0
(
1
−
z
d
)
+
c
1
z
d
c=c_0(1-z_d)+c_1z_d
c=c0(1−zd)+c1zd
如此我们就得到了一个点的值。三线性插值的结果与沿三个轴的插值步骤的顺序无关:任何其他顺序,例如沿x,然后沿y,最后沿z,产生相同的值。
根据以上推导公式我们可以得到一个完整的公式