NifTK  16.4.1 - 0798f20
CMIC's Translational Medical Imaging Platform
niftkCMC33.h
Go to the documentation of this file.
1 /*=============================================================================
2 
3  NifTK: A software platform for medical image computing.
4 
5  Copyright (c) University College London (UCL). All rights reserved.
6 
7  This software is distributed WITHOUT ANY WARRANTY; without even
8  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
9  PURPOSE.
10 
11  See LICENSE.txt in the top level directory for details.
12 
13 =============================================================================*/
14 
15 //________________________________________________
16 // ALGORITHM AND SOURCE WAS ADOPTED FROM:
30 //________________________________________________
31 
32 
33 #ifndef niftkCMC33_h
34 #define niftkCMC33_h
35 
36 #include "niftkCoreExports.h"
37 
38 #include <vector>
39 
40 #include "niftkBasicVertex.h"
41 #include "niftkBasicTriangle.h"
42 
43 namespace niftk
44 {
45 
46 //_____________________________________________________________________________
47 // types
49 typedef unsigned char uchar;
51 typedef signed char schar;
53 typedef float real ;
54 
55 
56 
61 struct MeshData
62 {
63  std::vector<BasicVertex> m_Vertices ; // vertex buffer
64  std::vector<BasicTriangle> m_Triangles ; // triangle buffer
65  std::vector< std::vector<size_t> > m_VertexToTriangleIndices; // lookup table vertex-->triangle
66  std::vector< std::vector<size_t> > m_VertexToVertexIndices; // vertex adjacency list
67 };
68 
69 
70 
71 //_____________________________________________________________________________
76 class NIFTKCORE_EXPORT CMC33
77  //-----------------------------------------------------------------------------
78 {
79  // Constructors
80 public :
88  CMC33 ( const int size_x = -1, const int size_y = -1, const int size_z = -1 );
90  ~CMC33();
91 
92  //-----------------------------------------------------------------------------
93  // Accessors
94 public :
96  inline const int nverts() const { return _nverts; }
98  inline const int ntrigs() const { return _ntrigs; }
99 
101  inline const int size_x() const { return _size_x; }
103  inline const int size_y() const { return _size_y; }
105  inline const int size_z() const { return _size_z; }
106 
113  //inline void set_resolution( const int size_x, const int size_y, const int size_z ) { _size_x = size_x; _size_y = size_y; _size_z = size_z; }
118  inline void set_method ( const bool originalMC = false ) { _originalMC = originalMC; }
119 
124  inline void set_input_data ( real *data ) { if( !_ext_data ) delete [] _data; _ext_data = data != NULL; if( _ext_data ) _data = data; }
125 
127  inline void set_output_data (MeshData * meshData) { m_MeshDataExt = meshData; }
128 
130  inline void enable_normal_computing(bool value) { _computeNormals = value; }
131 
132  // Data initialization
134  void init_temps ();
136  void init_all ();
138  void clean_temps();
140  void clean_all ();
142  void restart();
143 
144  //-----------------------------------------------------------------------------
145  // Algorithm
146 public :
151  void run( real iso = (real)0.0 );
152 
153 protected :
155  void process_cube () ;
157  bool test_face ( schar face );
159  bool test_interior( schar s ) ;
161  bool modified_test_interior(schar s);
163  int interior_ambiguity(int amb_face, int s);
165  int interior_ambiguity_verification(int edge);
166 
167  bool interior_test_case13();
168  bool interior_test_case13_2(float isovalue);
169 
170  // Data access
177  inline const real get_data ( const int i, const int j, const int k ) const { return _data[ i + j*_size_x + k*_size_x*_size_y]; }
178 
179  //-----------------------------------------------------------------------------
180  // Operations
181 protected :
186  void compute_intersection_points( real iso );
187 
194  void add_triangle ( const char* trig, char n, int v12 = -1 );
195 
197  void test_vertex_addition();
199  int add_x_vertex();
201  int add_y_vertex();
203  int add_z_vertex();
205  int add_c_vertex();
206 
213  real get_x_grad( const int i, const int j, const int k ) const;
220  real get_y_grad( const int i, const int j, const int k ) const;
227  real get_z_grad( const int i, const int j, const int k ) const;
228 
235  inline int get_x_vert( const int i, const int j, const int k ) const { return _x_verts[ i + j*_size_x + k*_size_x*_size_y]; }
242  inline int get_y_vert( const int i, const int j, const int k ) const { return _y_verts[ i + j*_size_x + k*_size_x*_size_y]; }
249  inline int get_z_vert( const int i, const int j, const int k ) const { return _z_verts[ i + j*_size_x + k*_size_x*_size_y]; }
250 
258  inline void set_x_vert( const int val, const int i, const int j, const int k ) { _x_verts[ i + j*_size_x + k*_size_x*_size_y] = val; }
266  inline void set_y_vert( const int val, const int i, const int j, const int k ) { _y_verts[ i + j*_size_x + k*_size_x*_size_y] = val; }
274  inline void set_z_vert( const int val, const int i, const int j, const int k ) { _z_verts[ i + j*_size_x + k*_size_x*_size_y] = val; }
275 
277  void print_cube();
278 
280  void resizeAndAllocateConnectivity(int index);
281 
282  //-----------------------------------------------------------------------------
283  // Elements
284 protected :
285  bool _originalMC;
286  bool _ext_data ;
290  int _size_x ;
291  int _size_y ;
292  int _size_z ;
293  real *_data ;
295  int *_x_verts ;
296  int *_y_verts ;
297  int *_z_verts ;
299  int _nverts ;
300  int _ntrigs ;
301  int _Nverts ;
302  int _Ntrigs ;
307  int _i ;
308  int _j ;
309  int _k ;
311  real _cube[8] ;
312  uchar _lut_entry ;
313  uchar _case ;
314  uchar _config ;
315  uchar _subconfig ;
316 };
317 
318 //_____________________________________________________________________________
319 
320 }
321 
322 #endif
void set_x_vert(const int val, const int i, const int j, const int k)
Definition: niftkCMC33.h:258
const int size_y() const
Definition: niftkCMC33.h:103
int _j
Definition: niftkCMC33.h:308
int _nverts
Definition: niftkCMC33.h:299
const real get_data(const int i, const int j, const int k) const
Definition: niftkCMC33.h:177
void set_output_data(MeshData *meshData)
Definition: niftkCMC33.h:127
GLuint const GLfloat * val
Definition: glew.h:2691
std::vector< BasicVertex > m_Vertices
Definition: niftkCMC33.h:63
int _ntrigs
Definition: niftkCMC33.h:300
int get_x_vert(const int i, const int j, const int k) const
Definition: niftkCMC33.h:235
uchar _config
Definition: niftkCMC33.h:314
uchar _lut_entry
Definition: niftkCMC33.h:312
uchar _case
Definition: niftkCMC33.h:313
GLint GLenum GLsizei GLint GLsizei const GLvoid * data
Definition: glew.h:1363
int _k
Definition: niftkCMC33.h:309
int _size_x
Definition: niftkCMC33.h:290
int * _x_verts
Definition: niftkCMC33.h:295
int _Nverts
Definition: niftkCMC33.h:301
std::vector< std::vector< vcl_size_t > > m_VertexToTriangleIndices
Definition: niftkCMC33.h:65
float real
Definition: niftkCMC33.h:53
bool _ext_data
Definition: niftkCMC33.h:286
real * _data
Definition: niftkCMC33.h:293
int * _z_verts
Definition: niftkCMC33.h:297
int get_z_vert(const int i, const int j, const int k) const
Definition: niftkCMC33.h:249
const int size_x() const
Definition: niftkCMC33.h:101
GLsizei const GLfloat * value
Definition: glew.h:1833
MeshData * m_MeshDataExt
Definition: niftkCMC33.h:305
int _size_y
Definition: niftkCMC33.h:291
int _i
Definition: niftkCMC33.h:307
void set_method(const bool originalMC=false)
Definition: niftkCMC33.h:118
uchar _subconfig
Definition: niftkCMC33.h:315
Marching Cubes - CMC33 algorithm.
Definition: niftkCMC33.h:76
int * _y_verts
Definition: niftkCMC33.h:296
const int size_z() const
Definition: niftkCMC33.h:105
void set_y_vert(const int val, const int i, const int j, const int k)
Definition: niftkCMC33.h:266
std::vector< std::vector< vcl_size_t > > m_VertexToVertexIndices
Definition: niftkCMC33.h:66
GLuint index
Definition: glew.h:1798
void set_z_vert(const int val, const int i, const int j, const int k)
Definition: niftkCMC33.h:274
unsigned char uchar
Definition: niftkCMC33.h:49
bool _originalMC
Definition: niftkCMC33.h:285
std::vector< BasicTriangle > m_Triangles
Definition: niftkCMC33.h:64
bool _computeNormals
Definition: niftkCMC33.h:288
int _Ntrigs
Definition: niftkCMC33.h:302
GLclampd n
Definition: glew.h:6789
void enable_normal_computing(bool value)
Definition: niftkCMC33.h:130
int _size_z
Definition: niftkCMC33.h:292
int get_y_vert(const int i, const int j, const int k) const
Definition: niftkCMC33.h:242
const int nverts() const
Definition: niftkCMC33.h:96
const int ntrigs() const
Definition: niftkCMC33.h:98
Container class for passing around data structures containing a mesh.
Definition: niftkCMC33.h:61
void set_input_data(real *data)
Definition: niftkCMC33.h:124
GLdouble s
Definition: glew.h:1374
Definition: niftkExceptionObject.h:21
GLenum GLuint GLint GLenum face
Definition: glew.h:3832
signed char schar
Definition: niftkCMC33.h:51