Cette classe permet de polygoniser une isosurface d'un champ scalaire.
Il suffit d'indiquer à la calsse :
une fonction f(x,y,z)
l'espace d'étude
le niveau de discrétisation de l'espace
l'isovaleur a, tel que f(x,y,z)=a
La classe c++ :
marchingcube.cpp
marchingcube.h
Utilisation de la classe :
///////////////////////////////////////////////////////////////
// Somwhere in your program, define function ie scalar field
// must be static if used in class
double MyScalarField(double x,double y,double z)
{
return pow(x*x,0.3)+pow(y*y,0.3)+pow(z*z,0.3);
}
///////////////////////////////////////////////////////////////
// Now Use the CMarchingCube class
CMarchingCube* pMarchingCube=NULL;
ISOVERTEX* pVertexBuffer=NULL;
ULONG* pIndexBuffer=NULL;
ULONG nVertex=0,nIndex=0;
pMarchingCube=new CMarchingCube;
// Set the espace range
pMarchingCube->SetXRange(-1,1);
pMarchingCube->SetYRange(-1,1);
pMarchingCube->SetZRange(-1,1);
// Set level of discretization
pMarchingCube->SetStep(50);
// Set f(x,y,z)
pMarchingCube->SetFunction(MyScalarField); // set function
// Set isovalue
pMarchingCube->SetIsoValue(0.01);
// Polygonize
if (pMarchingCube->Polygonise())
{
nVertex=pMarchingCube->GetVertexBuffer(pVertexBuffer);
nIndex=pMarchingCube->GetIndexBuffer(pIndexBuffer);
}
// now you have an indexed vertex buffer
// of scalar field's isosurface=0.01
Exemples divers :