C++三线性插值代码实现

在这里插入图片描述
已知目标点C周围8个整数点的某个属性值,欲求出内部O点的值
需要做7次一维线性插值

  • 4次线性插值得到 I 、 J 、 K 、 L I、J、K、L IJKL
  • 2次线性插值得到 M 、 N M、N MN
  • 1次线性插值得到 O O O

( O − A ) = ( u , v , w ) (O-A) = (u,v,w) (OA)=(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(BA)J=D+u(CD)K=H+u(GH)L=E+u(FE)
  • 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(LI)=A+u(BA)+w(E+u(LE)A+u(BA))N=J+w(KJ)=....
  • O = M + v ( N − N ) = . . . . \color{red}O = M+v(N-N)=.... O=M+v(NN)=....

即: 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=(1u)(1v)(1w)A+u(1v)(1w)B+(1y)v(1w)C+uv(1w)D+(1u)(1v)wE+u(1v)wF+(1u)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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宗浩多捞

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值