C ++ Marching Cubes算法解释

时间:2015-01-11 01:45:23

标签: c++ algorithm graphics 3d marching-cubes

我正在尝试基于此描述在C ++中实现行进多维数据集算法:

http://paulbourke.net/geometry/polygonise/

但我不明白你如何计算" GRIDCELL"值。确切地说

 double val[8];

部分不清楚它的作用。我查看了一些例子,但它们太复杂了,很难理解这些值的计算方法。

typedef struct {
   XYZ p[8];
   double val[8];
} GRIDCELL;

据我了解XYZ p [8];是多维数据集的顶点坐标。但是什么val [8];是什么? 你能解释一下如何计算它们吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

行进立方体算法 - 如链接描述中所解释的 - 用于从采样数据构建多边形表示的算法。在

double val[8];

是立方体的8个顶点的样本。因此,它们不是计算出来的,它们是来自例如MRI扫描。因此,算法是另一种方法:获取一组测量数字并构建表面表示以便从中进行可视化。

答案 1 :(得分:1)

我进行了小规模的研究,现在我完全理解了算法。

首先关闭所有:

  • 体素表示三维空间中规则网格上的值。

我没有意识到这一点,但现在我是。

此值仅表示等值面。或者换言之,密度。

double val[8];

简化:从-1.0到0.0,体素可能是实心的或不是实心的。

对于iso值,例如可以使用perlin / simplex噪声。

答案 2 :(得分:1)

Te val是" charge"对于单元格的每个顶点,它取决于您想要创建的形状条纹。 f.e。:如果您想制作一个球,您可以使用以下公式对值进行采样:

 for (int l = 0; l < 8; ++l){
           float distance = sqrtf(pow(cell.p[l].x - chargepos.x, 2.0) + pow(cell.p[l].y - chargepos.y, 2.0) + pow(cell.p[l].z - chargepos.z, 2.0));

    cell.val[l] = chargevalue /pow(distance, 2.0);}