| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #ifndef MARCHING_CUBES_INCLUDED |
| | #define MARCHING_CUBES_INCLUDED |
| | #include <vector> |
| | #include "Geometry.h" |
| |
|
| | #define NEW_ORDERING 1 |
| |
|
| | class Square |
| | { |
| | public: |
| | const static unsigned int CORNERS=4 , EDGES=4 , FACES=1; |
| | static int CornerIndex (int x,int y); |
| | static int AntipodalCornerIndex(int idx); |
| | static void FactorCornerIndex (int idx,int& x,int& y); |
| | static int EdgeIndex (int orientation,int i); |
| | static void FactorEdgeIndex (int idx,int& orientation,int& i); |
| |
|
| | static int ReflectCornerIndex (int idx,int edgeIndex); |
| | static int ReflectEdgeIndex (int idx,int edgeIndex); |
| |
|
| | static void EdgeCorners(int idx,int& c1,int &c2); |
| | }; |
| |
|
| | class Cube{ |
| | public: |
| | const static unsigned int CORNERS=8 , EDGES=12 , FACES=6; |
| |
|
| | static int CornerIndex ( int x , int y , int z ); |
| | static void FactorCornerIndex ( int idx , int& x , int& y , int& z ); |
| | static int EdgeIndex ( int orientation , int i , int j ); |
| | static void FactorEdgeIndex ( int idx , int& orientation , int& i , int &j); |
| | static int FaceIndex ( int dir , int offSet ); |
| | static int FaceIndex ( int x , int y , int z ); |
| | static void FactorFaceIndex ( int idx , int& x , int &y , int& z ); |
| | static void FactorFaceIndex ( int idx , int& dir , int& offSet ); |
| |
|
| | static int AntipodalCornerIndex ( int idx ); |
| | static int FaceReflectCornerIndex ( int idx , int faceIndex ); |
| | static int FaceReflectEdgeIndex ( int idx , int faceIndex ); |
| | static int FaceReflectFaceIndex ( int idx , int faceIndex ); |
| | static int EdgeReflectCornerIndex ( int idx , int edgeIndex ); |
| | static int EdgeReflectEdgeIndex ( int edgeIndex ); |
| |
|
| | static int FaceAdjacentToEdges ( int eIndex1 , int eIndex2 ); |
| | static void FacesAdjacentToEdge ( int eIndex , int& f1Index , int& f2Index ); |
| |
|
| | static void EdgeCorners( int idx , int& c1 , int &c2 ); |
| | static void FaceCorners( int idx , int& c1 , int &c2 , int& c3 , int& c4 ); |
| |
|
| | static bool IsEdgeCorner( int cIndex , int e ); |
| | static bool IsFaceCorner( int cIndex , int f ); |
| | }; |
| |
|
| | class MarchingSquares |
| | { |
| | static double Interpolate(double v1,double v2); |
| | static void SetVertex(int e,const double values[Square::CORNERS],double iso); |
| | public: |
| | const static unsigned int MAX_EDGES=2; |
| | static const int edgeMask[1<<Square::CORNERS]; |
| | static const int edges[1<<Square::CORNERS][2*MAX_EDGES+1]; |
| | static double vertexList[Square::EDGES][2]; |
| | #if NEW_ORDERING |
| | static const int cornerMap[Square::CORNERS]; |
| | #endif |
| |
|
| | static unsigned char GetIndex( const float values[Square::CORNERS] , float iso ); |
| | static unsigned char GetIndex( const double values[Square::CORNERS] , double iso ); |
| | static bool IsAmbiguous( const double v[Square::CORNERS] , double isoValue ); |
| | static bool IsAmbiguous( unsigned char idx ); |
| | static bool HasRoots( unsigned char mcIndex ); |
| | #if NEW_ORDERING |
| | static bool HasEdgeRoots( unsigned char mcIndex , int edgeIndex ); |
| | #endif |
| | static int AddEdges( const double v[Square::CORNERS] , double isoValue , Edge* edges ); |
| | static int AddEdgeIndices( const double v[Square::CORNERS] , double isoValue , int* edges); |
| | static int AddEdgeIndices( unsigned char mcIndex , int* edges); |
| | }; |
| |
|
| | class MarchingCubes |
| | { |
| | static void SetVertex(int e,const double values[Cube::CORNERS],double iso); |
| | static unsigned char GetFaceIndex( const double values[Cube::CORNERS] , double iso , int faceIndex ); |
| |
|
| | static void SetVertex(int e,const float values[Cube::CORNERS],float iso); |
| | static unsigned char GetFaceIndex( const float values[Cube::CORNERS] , float iso , int faceIndex ); |
| |
|
| | public: |
| | static unsigned char GetFaceIndex( unsigned char mcIndex , int faceIndex ); |
| | static double Interpolate(double v1,double v2); |
| | static float Interpolate(float v1,float v2); |
| | const static unsigned int MAX_TRIANGLES=5; |
| | static const int edgeMask[1<<Cube::CORNERS]; |
| | static const int triangles[1<<Cube::CORNERS][3*MAX_TRIANGLES+1]; |
| | static const int cornerMap[Cube::CORNERS]; |
| | static double vertexList[Cube::EDGES][3]; |
| |
|
| | static int AddTriangleIndices(int mcIndex,int* triangles); |
| |
|
| | static unsigned char GetIndex( const double values[Cube::CORNERS] , double iso ); |
| | static bool IsAmbiguous( const double v[Cube::CORNERS] , double isoValue , int faceIndex ); |
| | static bool HasRoots( const double v[Cube::CORNERS] , double isoValue ); |
| | static bool HasRoots( const double v[Cube::CORNERS] , double isoValue , int faceIndex ); |
| | static int AddTriangles( const double v[Cube::CORNERS] , double isoValue , Triangle* triangles ); |
| | static int AddTriangleIndices( const double v[Cube::CORNERS] , double isoValue , int* triangles ); |
| |
|
| | static unsigned char GetIndex( const float values[Cube::CORNERS] , float iso ); |
| | static bool IsAmbiguous( const float v[Cube::CORNERS] , float isoValue , int faceIndex ); |
| | static bool HasRoots( const float v[Cube::CORNERS] , float isoValue ); |
| | static bool HasRoots( const float v[Cube::CORNERS] , float isoValue , int faceIndex ); |
| | static int AddTriangles( const float v[Cube::CORNERS] , float isoValue , Triangle* triangles ); |
| | static int AddTriangleIndices( const float v[Cube::CORNERS] , float isoValue , int* triangles ); |
| |
|
| | static bool IsAmbiguous( unsigned char mcIndex , int faceIndex ); |
| | static bool HasRoots( unsigned char mcIndex ); |
| | static bool HasFaceRoots( unsigned char mcIndex , int faceIndex ); |
| | static bool HasEdgeRoots( unsigned char mcIndex , int edgeIndex ); |
| | }; |
| | #endif |
| |
|