简而言之,我正在寻找:(1)处理等高线/等值面查找算法的出版物或其他来源,以便我可以编写自己的实现(并尽可能并行化),或(2)关于高的建议Fortran、C/C++ 或其他语言的级别库,这对于从标量 3D 网格中查找此类表面可能很有用。
我目前正在分析来自非常大的流体动力学模拟的检查点文件中的数据(带拉格朗日汇粒子的 AMR - HDF5 格式的数据),并希望找到一种算法来有效地计算等势面(又名计数或等值面)引力标量势网格。特别是,我需要能够在选定的局部最小值附近找到最大的闭合等势面(在一些可接受的步长误差内),这可能不会包含任何其他最小值. 该表面将用作进一步分析封闭细胞形成的体积的选择标准。此链接(特别是第 3 节)提供了我大致尝试复制的过程的描述,尽管提供的 IDL 代码将列密度的 2D FITS 图作为输入,并且它们的数据要小得多:http://www.astro .umd.edu/~hgong/GRID_core.htm
这似乎与在图形中计算和渲染等值面的问题非常相似(即,行进立方体算法的一些变体似乎相关),但是因为我有兴趣使用表面作为选择所有内部网格单元的边界,而不是比起可视化它,我熟悉的大多数库似乎都不适合(例如 VTK)。但是,如果有人知道我如何为此目的使用图形算法,我很乐意被证明是错误的——也许有一种方法可以使用图形库例程找到等值面,然后简单地提取有关表面位置或边界单元的信息?
非常感谢有关如何解决此问题的任何建议,或有关可能有用的库的想法。如果我或多或少地从头开始编写算法,我可能会使用 Fortran(对我来说更容易并行化),但如果它们支持更适合该任务的库,我会很乐意使用 C/C++ 或其他语言。
提前致谢!
更新:经过更多的研究,我很乐观地认为等高线树将是解决这个问题的完美数据结构。这是一个相当非正式的描述。它似乎为一组等值面的拓扑如何随等值变化提供了一个非常抽象的图形表示。
局部最大值和最小值表示为叶节点,据说创建或终止“组件”(图边)。内部顶点/节点表示组件在关键点的连接或分裂,或属的变化 - 换句话说,拓扑事件。也可以扫描与两个事件相关的等值面之间的空间,并将该区域中的所有数据点分配给连接两个事件的组件。这个更彻底的出版物称之为增强轮廓树。
考虑到这一点,我当前的策略非常简单:一旦生成了增强轮廓树,那么我想要与局部最小值相关联的单元格就是那些与局部最小值叶节点和最近拓扑事件之间的组件相关联的单元格顶点。