3 #ifndef __u3d_data_cube_hpp 
    4 #define __u3d_data_cube_hpp 
   11 #include "u3d_migr.hpp" 
   12 #include <mix/u3d_progress.hpp> 
   14 typedef unsigned short ushort;
 
   20 enum PlaneOrient {PT_X, PT_Y, PT_Z};
 
   41     innerArrayAccessor(0, 0 ,0),
 
   42     sliceAccessor(innerArrayAccessor)
 
   46   U3dArray3D(
size_t width, 
size_t height, 
size_t depth) : 
 
   47     innerArrayAccessor(width, height, depth),
 
   48     sliceAccessor(innerArrayAccessor)
 
   53     innerArrayAccessor(that.innerArrayAccessor),
 
   54     sliceAccessor(innerArrayAccessor)
 
   60     innerArrayAccessor.~InnerArray();
 
   61     new(&innerArrayAccessor) InnerArray(that.innerArrayAccessor);
 
   62     sliceAccessor.~SliceAccessor();
 
   63     new(&sliceAccessor) SliceAccessor(innerArrayAccessor);
 
   68   inline SliceAccessor&        operator[](
const size_t& slNdx)       { 
return sliceAccessor(slNdx); }
 
   69   inline const SliceAccessor&  operator[](
const size_t& slNdx)
 const { 
return sliceAccessor(slNdx); }
 
   73   T&        element(
size_t i, 
size_t j, 
size_t k) { 
 
   74     assert(i<innerArrayAccessor.m_width &&
 
   75        j<innerArrayAccessor.m_height &&
 
   76        k<innerArrayAccessor.m_depth);
 
   77     return innerArrayAccessor.m_array[innerArrayAccessor.m_depth*(i*innerArrayAccessor.m_height + j) + k];
 
   79   const T&  element(
size_t i, 
size_t j, 
size_t k)
 const { 
 
   80     assert(i<innerArrayAccessor.m_width &&
 
   81        j<innerArrayAccessor.m_height &&
 
   82        k<innerArrayAccessor.m_depth);
 
   83     return innerArrayAccessor.m_array[innerArrayAccessor.m_depth*(i*innerArrayAccessor.m_height + j) + k];
 
   88   void setDimensions(
size_t width, 
size_t height, 
size_t depth) {
 
   89     innerArrayAccessor.~InnerArray();
 
   90     new(&innerArrayAccessor) InnerArray(width, height, depth);
 
   91     sliceAccessor.~SliceAccessor();
 
   92     new(&sliceAccessor) SliceAccessor(innerArrayAccessor);
 
   98     for (
size_t i=0; i<innerArrayAccessor.m_size; innerArrayAccessor.m_array[i++] = t);
 
  103   T*       innerArray()       { 
return innerArrayAccessor.m_array; }
 
  104   const T* innerArray()
 const { 
return innerArrayAccessor.m_array; }
 
  108   size_t size()
         const { 
return innerArrayAccessor.m_size;  }
 
  111   size_t width()
        const { 
return innerArrayAccessor.m_width; }
 
  112   size_t height()
       const { 
return innerArrayAccessor.m_height;}
 
  113   size_t depth()
        const { 
return innerArrayAccessor.m_depth; }
 
  116   void clear()                { setDimensions(0,0,0); }
 
  125     InnerArray(
size_t width, 
size_t height, 
size_t depth) :
 
  126       m_width(width), m_height(height), m_depth(depth),
 
  127       m_size(width*height*depth), m_array(
new T[m_size])
 
  130     InnerArray(
const InnerArray& that) :
 
  131       m_width(that.m_width), m_height(that.m_height), m_depth(that.m_depth),
 
  132       m_size(that.m_size), m_array(
new T[m_size])  
 
  134       std::copy(that.m_array, that.m_array + that.m_size, m_array);
 
  137     ~InnerArray()    { 
delete[] m_array; }
 
  139     inline InnerArray&        operator()(
const size_t& colNum) { 
 
  140       offset = colNum*m_depth;  
return *
this; 
 
  142     inline const InnerArray&  operator()(
const size_t& colNum)
 const { 
 
  143       offset = colNum*m_depth;  
return *
this; 
 
  145     inline T&                 operator[](
const size_t& depthNdx) { 
 
  146       assert(depthNdx < m_depth);
 
  147       return m_array[offset+depthNdx]; 
 
  149     inline const T&           operator[](
const size_t& depthNdx)
 const { 
 
  150       assert(depthNdx < m_depth);
 
  151       return m_array[offset+depthNdx]; 
 
  160     mutable size_t  offset;
 
  166   class SliceAccessor {
 
  168     SliceAccessor(InnerArray& inArr)  :  colsPerSlice(inArr.m_height), innerArrayAccessor(inArr) {}
 
  169     inline SliceAccessor&       operator()(
const size_t& slNum) { 
 
  170       assert(slNum < innerArrayAccessor.m_width);
 
  171       offsetInColumns = slNum*colsPerSlice;  
return *
this;
 
  173     inline const SliceAccessor& operator()(
const size_t& slNum)
 const { 
 
  174       assert(slNum < innerArrayAccessor.m_width);
 
  175       offsetInColumns = slNum*colsPerSlice;  
return *
this;
 
  177     inline InnerArray&          operator[](
const size_t& colNum) { 
 
  178       assert(colNum < innerArrayAccessor.m_height);
 
  179       return innerArrayAccessor(offsetInColumns + colNum); 
 
  181     inline const InnerArray&    operator[](
const size_t& colNum)
 const { 
 
  182       assert(colNum < innerArrayAccessor.m_height);
 
  183       return innerArrayAccessor(offsetInColumns + colNum); 
 
  187     mutable size_t offsetInColumns;
 
  189     InnerArray& innerArrayAccessor;
 
  193   InnerArray      innerArrayAccessor;
 
  194   SliceAccessor   sliceAccessor;
 
  216     badcontent(
const char* str) { strncpy(message, str, 127); };
 
  217     const char* what() 
const throw() { 
return message; };
 
  227   U3dDataCube(ushort i_size, ushort j_size, ushort k_size, 
float x_max, 
float y_max, 
float z_max);
 
  235   bool     initialize(ushort i_size, ushort j_size, ushort k_size, 
float x_max, 
float y_max, 
float z_max);
 
  242   void     generate(ushort i_max, ushort j_max, ushort k_max, 
float x_max, 
float y_max, 
float z_max);
 
  245   void     getDimensions(ushort* widthX, ushort* heightY, ushort* depthZ);
 
  250   void     saveToFile(
const char* fname);
 
  252   unsigned getImageSize();
 
  255   bool     getPlaneFacet(
const PlaneOrient& op, 
const float& coord, 
float*& images);
 
  260              ushort* width, ushort* depth);
 
  264              ushort* width, ushort* depth);
 
  273   void     setValue(
const int& i, 
const int& j, 
const int& k, 
const float& ampl);
 
  279   float    getValue(
const int& i, 
const int& j, 
const int& k) { 
return m_ampl[i][j][k]; }
 
  281   float    getMaxValue() { 
return m_vmax; }
 
  282   float    getMinValue() { 
return m_vmin; }
 
  289   virtual bool save(
char *OutMod) { 
UMessage::error(
"Not allowed here."); 
return false; }
 
  292   void     smData(
int* epsilon);
 
  320   float m_vmax, m_vmin;
 
  325 #endif // __u3d_data_cube_hpp 
bool m_ready
Definition: u3d_data_cube.hpp:306
Definition: u3d_data_cube.hpp:206
bool getPlaneFacet(const PlaneOrient &op, const float &coord, float *&images)
bool getReady()
Definition: u3d_data_cube.hpp:270
void generate(ushort i_max, ushort j_max, ushort k_max, float x_max, float y_max, float z_max)
bool getPlaneAxeIntrpl(float xn, float yn, float xk, float yk, float *&images, ushort *width, ushort *depth)
Definition: u3d_box.hpp:24
Definition: u3d_data_cube.hpp:213
void getDimensions(ushort *widthX, ushort *heightY, ushort *depthZ)
static void error(const char *format,...)
float getValue(const int &i, const int &j, const int &k)
Definition: u3d_data_cube.hpp:279
ushort m_width
Definition: u3d_data_cube.hpp:308
float m_stepX
Definition: u3d_data_cube.hpp:316
ushort m_depth
Definition: u3d_data_cube.hpp:310
float m_stepY
Definition: u3d_data_cube.hpp:317
bool saveImage(char *OutMod, U3dBox *image_box=NULL)
U3dArray3D< float > m_ampl
Definition: u3d_data_cube.hpp:313
ushort m_height
Definition: u3d_data_cube.hpp:309
bool getPlaneAxeSimple(float xn, float yn, float xk, float yk, float *&images, ushort *width, ushort *depth)
Definition: u3d_model.hpp:15
Definition: u3d_progress.hpp:10
Definition: u3d_data_cube.hpp:31
void setValue(const int &i, const int &j, const int &k, const float &l)
float m_stepZ
Definition: u3d_data_cube.hpp:318
void getCubeCoordLimits(float &xmax, float &ymax, float &zmax)
U3dArray3D< ushort > m_ampl_num
Definition: u3d_data_cube.hpp:314
virtual U3dDataCube * clone()
Definition: u3d_data_cube.hpp:302
void loadFromFile(const char *fileName)