//******************************************************************** // //******************************************************************** #pragma once #include "orbitals.h" // dynamic allocation kill performance #define MC_MAX_VERTEX 100000 #define MC_MAX_INDEX 100000 typedef double (*function)(double,double,double); //******************************************************************** // Structures //******************************************************************** struct VECTOR { double x, y, z; }; struct ISOVERTEX { VECTOR p; VECTOR n; }; struct TRIANGLE { VECTOR p[3]; VECTOR n; }; struct CELL { VECTOR p[8]; double val[8]; }; struct GRID { VECTOR p; double val; }; //******************************************************************** // CMarchingCube Class //******************************************************************** class CMarchingCube { public: CMarchingCube(void); ~CMarchingCube(void); BOOL Polygonise(); void SetFunction(function Function){m_pFunction=Function;} void SetXRange(double XMin,double XMax){m_XMin=XMin;m_XMax=XMax;} void SetYRange(double YMin,double YMax){m_YMin=YMin;m_YMax=YMax;} void SetZRange(double ZMin,double ZMax){m_ZMin=ZMin;m_ZMax=ZMax;} void SetIsoLevel(double IsoLevel){m_IsoLevel=IsoLevel;} void SetStep(UINT Step){m_Step=Step;} void ComputeNormals(); ULONG GetVertexBuffer(ISOVERTEX **pVertexBuffer) {*pVertexBuffer=m_VertexBuffer;return m_nVertex;}; ULONG GetIndexBuffer(ULONG **pIndexBuffer) {*pIndexBuffer=m_IndexBuffer;return m_nIndex;}; ISOVERTEX m_VertexBuffer[MC_MAX_VERTEX]; ULONG m_IndexBuffer[MC_MAX_INDEX]; ULONG m_nVertex; ULONG m_nIndex; private: double m_XMax; double m_XMin; double m_YMax; double m_YMin; double m_ZMax; double m_ZMin; double m_IsoLevel; UINT m_Step; function m_pFunction; void PolygoniseCell(CELL grid,int CubeIndex); void PolygoniseCell2(CELL g,int v0,int v1,int v2,int v3); VECTOR VertexInterpolate(VECTOR P1,VECTOR P2,double ValP1,double ValP2); BOOL IsVertexExists(VECTOR Vector,ULONG *Index); static int EdgeTable[256]; static int TriTable[256][16]; };