已知目标点C周围8个整数点的某个属性值,欲求出内部O点的值
需要做7次一维线性插值
- 4次线性插值得到 I 、 J 、 K 、 L I、J、K、L I、J、K、L
- 2次线性插值得到 M 、 N M、N M、N
- 1次线性插值得到 O O O
设 ( O − A ) = ( u , v , w ) (O-A) = (u,v,w) (O−A)=(u,v,w), u v w 就相当于权重
- I = A + u ( B − A ) J = D + u ( C − D ) K = H + u ( G − H ) L = E + u ( F − E ) I = A + u(B-A)\\J = D + u(C-D)\\K = H+u(G-H)\\L=E+u(F-E) I=A+u(B−A)J=D+u(C−D)K=H+u(G−H)L=E+u(F−E)
- M = I + w ( L − I ) = A + u ( B − A ) + w ( E + u ( L − E ) − A + u ( B − A ) ) N = J + w ( K − J ) = . . . . M = I + w(L-I)=A+u(B-A)+w(E+u(L-E) -A + u(B-A)) \\N = J+w(K-J)=.... M=I+w(L−I)=A+u(B−A)+w(E+u(L−E)−A+u(B−A))N=J+w(K−J)=....
- O = M + v ( N − N ) = . . . . \color{red}O = M+v(N-N)=.... O=M+v(N−N)=....
即: O = ( 1 − u ) ( 1 − v ) ( 1 − w ) A + u ( 1 − v ) ( 1 − w ) B + ( 1 − y ) v ( 1 − w ) C + u v ( 1 − w ) D + ( 1 − u ) ( 1 − v ) w E + u ( 1 − v ) w F + ( 1 − u ) v w G + u v w H \color{red}O=(1-u)(1-v)(1-w)A+u(1-v)(1-w)B+(1-y)v(1-w)C\\\:\:\:\:\:\:\:\:\:+uv(1-w)D+(1-u)(1-v)wE+u(1-v)wF+(1-u)vwG+uvwH O=(1−u)(1−v)(1−w)A+u(1−v)(1−w)B+(1−y)v(1−w)C+uv(1−w)D+(1−u)(1−v)wE+u(1−v)wF+(1−u)vwG+uvwH
写成代码
// 三线性插值
// c[2][2][2] 就是8个整数点,A对应C[0][0][0],H对应C[1][1][1]
double trilinear_interp(double c[2][2][2], double u, double v, double w)
{
auto accum = 0.0;
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
for (int k = 0; k < 2; k++)
accum += (i*u + (1 - i)*(1 - u)) *
(j*v + (1 - j)*(1 - v)) *
(k*w + (1 - k)*(1 - w)) *
c[i][j][k];
return accum;
}