Algorithme "marching cube"

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 :

    image1_thumb.jpg   image1w_thumb.jpg

    image2_thumb.jpg   image2w_thumb.jpg

    marchingcube_thumb.jpg

    Lundi 06 Septembre 2010
    English Francais