Python中的三维网格插值
我有一个规则的网格,包含x、y、z坐标和一个变量v。我想根据给定的x、y和z值来进行插值。但是我不想使用numpy或scipy,因为在我将要运行的环境中没有安装它们。
如果我能找到周围的8个网格节点,我可以用什么数学方法来进行插值呢?
谢谢!
1 个回答
2
这其实是个数学问题,但你提到了Python,所以我也给你一些代码。通常情况下,你会用到三线性插值。
我们假设你的网格有两个角落,一个是(0.0, 0.0, 0.0)
,另一个是(max_x, max_y, max_z)
,并且它和坐标系统是对齐的。我们用(n_x, n_y, n_z)
来表示每个轴上的单元格数量,而你想要评估的点用(x, y, z)
表示(这些都是float
类型)。那么你的逻辑可能类似于
a_x = x * n_x / max_x
a_y = y * n_y / max_y
a_z = z * n_z / max_z
i_x = math.floor(a_x)
i_y = math.floor(a_y)
i_z = math.floor(a_z)
l_x = a_x - i_x
l_y = a_y - i_y
l_z = a_z - i_z
现在,8个相邻网格顶点的索引是(i_x, i_y, i_z)
,(i_x+1, i_y, i_z)
,(i_x, i_y+1, i_z)
,等等,直到(i_x+1, i_y+1, i_z+1)
。你在网格单元内的局部坐标是(l_x, l_y, l_z)
。结合上面提到的维基百科文章,这应该能帮助你入门(注意那里的符号表示可能不同)。