我有一组坐标由数组 x , y 和 z 给出,并且每个点中密度场的值存储在数组 d 中。 我想在均匀网格上重建密度场。 最好的算法是什么?
我知道在Python中,Scipy模块的
griddata 函数很方便,但我想编写自己的代码,我只需要一个提示。
griddata 函数很方便,但我想编写自己的代码,我只需要一个提示。
如果您有某种标量场,并且点是场的起源,您可以通过遍历所有格点并计算给定源的场强度来实现暴力方法。有递归方法允许“消除”宽范围的体积,其中场几乎是恒定的,并且通过计算从一个点到下一个点的变化来节省一些CPU时间的技术。
如果您拥有的点是值的采样,则必须将空间分解为卷,并插值值。您可以使用简单的Voronoi分解-通常在2D中进行降水测量-或Delaunay四面体化(您可以查看TetGen的文档)。第一种方法假定每个Voronoi体积中函数是恒定的;最后允许呈现三线性插值。
如果您需要平滑3D网格,则三线性插值似乎是最佳方法。
还有其他用于快速可视化的方法,涉及维护按距离从任何一个给定点到您的常规网格中的顺序排列的3D点列表。在穿过网格时,您使用二次增量重新计算距离。然后,您根据所选基数的一部分点执行简单的插值(即,如果您考虑距离d1..d4的四个最近点,则通过按比例加权v1..v4的值来计算P中的值)。这种方法自己实现起来快速而容易,但请注意,在点之间的最小距离小于晶格步长的地方,它的性能不佳(您可以通过考虑更多的点来补偿这一点;如果采样函数在相同的尺度上平滑,则效果不太明显)。
[x,y,z]
的 Delaunay 三角剖分(在您的 3D 情况下实际上是四面体剖分!),并在每个元素内使用密度场的线性表示进行插值,该线性表示在四面体顶点处定义。