3

我有一个设置点,其坐标由数组给出xy并且z每个点的密度字段的值存储在数组中d。我想在均匀的网格上重建密度场。最好的算法是什么?我知道在 python 中,scipy 模块在griddata函数中派上用场,但我想编写自己的代码,我只需要提示。

4

3 回答 3

1

如果你想自己实现一种数学方法,当然需要学习理论。在这种情况下,它是3D 分散数据插值

WikipediaMATLAB helpscipy help说至少有六种不同的方法。WP 对它们有相当好的描述,并且有一篇比较文章,但我强烈建议你在这样一个术语密集的主题上用你的母语找到一些东西。

于 2012-10-20T15:42:59.117 回答
1

一种方法是形成散点的 Delaunay 三角剖分[x,y,z],(实际上是 3d 情况下的四面体化!)并使用在四面体顶点处定义的密度场的线性表示在每个元素内执行插值。

要评估每个结构化网格点的密度,您将 (i) 确定该点位于哪个四面体内并 (ii) 评估线性插值。

形成 Delaunay 三角剖分并非易事,根据您选择的语言,有一些很好的库可以用于此。一个不错的选择是CGAL

希望这可以帮助。

于 2012-10-20T15:48:01.070 回答
1

如果您有某种标量场并且这些点是场的起源,您可以通过遍历所有格点并计算给定源的场强来实施蛮力方法。有两种递归方法允许在字段或多或少恒定的情况下“消隐”大体积,以及通过计算从一个点到下一个点的变化来节省一些 CPU 时间的技术。

如果您拥有的点是一个值的样本,那么您将不得不按体积分解您的空间并插入这些值。您可以使用简单的 Voronoi 分解 - 这通常在 2D 中进行降水测量 - 或Delaunay 四面体化(您可以查看TetGen的文档)。第一种方法假设函数在每个 Voronoi 体积中是恒定的;最后一个允许渲染三线性插值

如果您需要平滑 3D 网格,三线性插值看起来是最好的方法。

还有其他用于快速可视化的方法,包括按照与常规网格中任何给定点的距离顺序维护一个 3D 点列表。在网格中移动时,您使用二次增量重新计算距离。然后,您根据所选基数的点子集执行简单的插值(即,如果您考虑距离 d1..d4 处最近的四个点,您将通过按比例加权值 v1..v4 来计算 P 中的值) . 这种方法快速且易于自己实施,但请注意,只要点之间的最小距离小于晶格步长,它就会表现不佳(您可以通过考虑更多发生这种情况的点来进行补偿;如果采样函数在相同尺度下是平滑的)。

于 2012-10-20T16:09:54.453 回答