高维等值面跟踪

时间:2015-05-20 06:35:03

标签: dimensions dimensional

如何有效地在更高维空间上追踪等值面

2 个答案:

答案 0 :(得分:1)

您在 N 维度中有标量成本函数,

  

f y 0 y 1 ,..,< i> y N )εℝ, y εℝ

但仅在常规矩形网格中采样

  

y k = Ψ k + ψ k < / i> x k ,常数Ψ k εℝ和ψ k εℝ,网格坐标 x k εℕ

问题是找到isosurface(s) i

  

f y 0 y 1 ,..,< i> y N )= C i

直接方法是循环遍历网格中的每个单元格,并检查当前等值面是否与当前单元格相交,如果是,则描述当前单元格中等值面的部分。 (Marching Cubes是描述等值面如何与每个网格单元相交的一种方法。)

这里的限制是使用基于邻域的搜索而不是检查每个单元格。

OP专门针对3D案例previous question,我posted指向示例代码grid.hgrid.c的链接(在Pastebin.com上,因为他们太长了,不能包括内联)。

该实现与OP的切片方法完全不同。我的是一个直接的,简单的走过与当前等值面相交的网格单元。它缓存网格样本,并使用单独的映射(每个网格单元一个char)来跟踪哪些网格单元已被缓存,行走和/或推送到堆栈以便稍后行走。这种方法很容易扩展到三个以上的维度。虽然代码是针对三个维度编写的,但该方法本身并不特定于三个维度;您需要做的就是调整数据结构以适应任何(合理的)维数。

等值面行走本身是微不足道的。您从等值面相交的任何网格单元开始,然后检查所有2 N 最近邻居单元格,以查看等值面是否与这些相同。在实践中,您使用要检查的网格单元位置堆栈,以及网格单元格标记的映射,以避免重新检查已检查的网格单元格。

因为每个网格单元的网格点样本的数量是2 N ,所以我的示例代码不是最佳的:许多附近的网格点最终被评估以查看相邻的网格单元是否相交等值面。 (不是仅检查界定等值面的网格点,而是检查属于等值面周围任何网格单元的网格点。)随着 N 的增加,这项额外工作呈指数增长。

更好的方法是分别考虑2 N个可能的( N -1)面中的每一个,以避免检查等值面根本不相交的单元格

N 维规则矩形网格中,每个单元格是 N 维立方体,由2 N 定义顶点(角落)处的网格点。 N - 小区细胞具有 N <(i> N -1)个二维面,并且具有2 N (< i> N -1) - 维面孔。

要检查每个( N -1)面,您需要检查2 N -1 网格点的成本函数定义( N -1) - 面。如果这些点的成本函数跨越等值面值,则等值面与( N -1)面相交,并且等值面也与该方向上的下一个网格单元相交。

有两个( N -1) - 面垂直于每个轴。如果等值面与( N -1)面接近负无穷大相交,则等值面也沿着该轴与下一个网格单元相交,朝向负无穷大。类似地,如果等值面与( N -1) - 面更接近正无穷大相交,那么它也沿着该轴与下一个网格单元朝向正无穷大相交。因此,( N -1) - 面是完美的,用于决定应该检查哪些相邻小区。这是正确的,因为( N -1) - 面恰好是两个单元共享的网格点集。

我对提供示例C代码非常犹豫,因为3D案例的相同方法的示例代码到目前为止似乎没有帮助过任何人。我担心需要用二维和三维示例图像进行更长时间的解释,以便用易于理解的术语描述该方法;并且没有牢牢掌握逻辑,任何示例代码都会像gobbledygook。

答案 1 :(得分:1)

你最好使用2维库,你可以尝试Paul Bourke教授的conrec算法。它类似于行进立方体。