C++行进立方体算法解释

C++ Marching Cubes Algorithm Explanation

本文关键字:算法 解释 立方体 C++      更新时间:2023-10-16

我试图了解行进立方体算法的工作原理。

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

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

 double val[8];

部分对我来说不清楚它实际上应该包含什么。

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

据我了解,XYZ p[8]; 是输出立方体的顶点坐标。但是什么价值[8];是?

行进立方体算法 - 如链接描述中所述 - 一种从采样数据构建多边形表示的算法。这

double val[8];

是立方体的 8 个顶点的样本。因此,它们不是经过计算的,它们是来自例如MRI扫描的测量值。因此,算法是相反的:获取一组测量数字并从中构建用于可视化的表面表示。

Te val 是单元格每个顶点的"电荷"水平,它取决于您要创建的形状尖端。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);}

经过进一步的阅读和研究,解释非常简单。

首先:

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

该值仅表示所谓的"等值面"。或者换句话说,空间的密度。

double val[8];

简化:基本上这应该是 -1.0f0.0f 之间的值。其中 -1.0f 表示实心空间和 0.0f 空白空间。

例如,对于ISO值,可以使用柏林/单工噪声。