Volume.cpp

Go to the documentation of this file.
00001 
00002 
00003 #include <Volume.hpp>
00004 #include <fstream>
00005 #include <cmath>
00006 
00007 Volume::Volume():Nx(0),Ny(0),Nz(0),data(){}
00008 Volume::~Volume(){}
00009 
00010 void Volume::resize(const unsigned int& _Nx,const unsigned int& _Ny,const unsigned int& _Nz)
00011 {
00012     data.resize(_Nx*_Ny*_Nz);
00013     Nx=_Nx;Ny=_Ny;Nz=_Nz;
00014 }
00015 double Volume::get_data(const unsigned int& kx,const unsigned int& ky,const unsigned int& kz) const
00016 {
00017     if(kx*ky*kz<Nx*Ny*Nz)
00018         return data[kx+Nx*(ky+Ny*kz)];
00019     else
00020         throw(std::string("Volume::get_data() outside bounds"));
00021 }
00022 void Volume::set_data(const unsigned int& kx,const unsigned int& ky,const unsigned int& kz,const double& value)
00023 {
00024     if(kx*ky*kz<Nx*Ny*Nz)
00025         data[kx+Nx*(ky+Ny*kz)]=value;
00026     else
00027         throw(std::string("Volume::set_data() outside bounds"));
00028 }
00029 
00030 
00031 Volume Volume::load_v4d(const std::string& filename)
00032 {
00033 
00034     Volume v;
00035 
00036 
00037     std::ifstream stream(filename.c_str(),std::ifstream::in);
00038 
00039     if(!stream.good())
00040     {throw std::string("Error in Volume::load_v4d("+filename+") : cannot open file \n");}
00041 
00042     std::string buffer;
00043     unsigned int Nx=0,Ny=0,Nz=0;
00044     stream>>Nx; stream>>Ny; stream>>Nz;
00045 
00046     std::cout<<" find file "<<filename<<" size=("<<Nx<<","<<Ny<<","<<Nz<<")"<<std::endl;
00047     v.resize(Nx,Ny,Nz);
00048 
00049     double f;
00050 
00051     for(unsigned int kx=0;stream.good() && kx<Nx;++kx)
00052     {
00053         for(unsigned int ky=0;stream.good() && ky<Ny;++ky)
00054         {
00055             for(unsigned int kz=0;stream.good() && kz<Nz;++kz)
00056             {
00057                 stream>>f;
00058                 if(stream.good())
00059                     v.set_data(kx,ky,kz,f);
00060             }
00061         }
00062     }
00063     stream.close();
00064     return v;
00065 }
00066 
00067 unsigned int Volume::size_x() const{return Nx;}
00068 unsigned int Volume::size_y() const{return Ny;}
00069 unsigned int Volume::size_z() const{return Nz;}
00070 
00071 std::vector <float> Volume::slice_x(const unsigned& kx) const
00072 {
00073     std::vector <float> slice(Ny*Nz);
00074     for(unsigned int ky=0;ky<Ny;++ky)
00075     {
00076         for(unsigned int kz=0;kz<Nz;++kz)
00077         {
00078             slice[ky+Ny*kz]=get_data(kx,ky,kz);
00079         }
00080     }
00081     return slice;
00082 }
00083 std::vector <float> Volume::slice_y(const unsigned& ky) const
00084 {
00085     std::vector <float> slice(Nx*Nz);
00086     for(unsigned int kx=0;kx<Nx;++kx)
00087     {
00088         for(unsigned int kz=0;kz<Nz;++kz)
00089         {
00090             slice[kx+Nx*kz]=get_data(kx,ky,kz);
00091         }
00092     }
00093     return slice;
00094 }
00095 std::vector <float> Volume::slice_z(const unsigned& kz) const
00096 {
00097     std::vector <float> slice(Nx*Ny);
00098     for(unsigned int kx=0;kx<Nx;++kx)
00099     {
00100         for(unsigned int ky=0;ky<Ny;++ky)
00101         {
00102             slice[kx+Nx*ky]=get_data(kx,ky,kz);
00103         }
00104     }
00105     return slice;
00106 }
00107 
00108 double Volume::operator()(const double& x,const double& y,const double& z) const
00109 {
00110     return linear_interpolation(x,y,z);
00111 }
00112 
00113 double Volume::linear_interpolation(const double& x,const double& y,const double& z) const
00114 {
00115     double epsilon=1e-6;
00116     if(x<0 || y<0 || z<0 || x+epsilon>=size_x() || y+epsilon>=size_y() || z+epsilon>=size_z())
00117     {
00118         //outside bounds
00119         return 0.0;
00120     }
00121 
00122     int x0=static_cast<int>(x);
00123     int y0=static_cast<int>(y);
00124     int z0=static_cast<int>(z);
00125 
00126     double ux;ux=(x-x0);
00127     double uy;uy=(y-y0);
00128     double uz;uz=(z-z0);
00129 
00130     double f=0.0;
00131 
00132     //******************************************************//
00133     //******************************************************//
00134     //**********  TO DO : Tri-linear interpolation *********//
00135     //******************************************************//
00136     //******************************************************//
00137     f=get_data(x0,y0,z0);
00138     //******************************************************//
00139     //******************************************************//
00140     //**********  /TO DO :                         *********//
00141     //******************************************************//
00142     //******************************************************//
00143 
00144     return f;
00145 }
00146 
00147 Volume Volume::resampled_square(const unsigned int& N) const
00148 {
00149     Volume vol2;vol2.resize(N,N,N);
00150 
00151 
00152     for(unsigned int k0=0;k0<N;++k0)
00153     {
00154         double ux=static_cast<double>(k0)/static_cast<double>(N-1);
00155         double x0=ux*(size_x()-1);
00156         for(unsigned int k1=0;k1<N;++k1)
00157         {
00158             double uy=static_cast<double>(k1)/static_cast<double>(N-1);
00159             double y0=uy*(size_y()-1);
00160             for(unsigned int k2=0;k2<N;++k2)
00161             {
00162                 double uz=static_cast<double>(k2)/static_cast<double>(N-1);
00163                 double z0=uz*(size_z()-1);
00164 
00165                 vol2.set_data(k0,k1,k2,(*this)(x0,y0,z0));
00166             }
00167         }
00168     }
00169 
00170     return vol2;
00171 
00172 }
00173 
00174 Volume Volume::rotated_z(const double& angle) const
00175 {
00176     unsigned int N=std::max(size_x(),size_y());
00177     Volume v2;v2.resize(N,N,size_z());
00178 
00179     double cos_a;cos_a=cos(angle);
00180     double sin_a;sin_a=sin(angle);
00181 
00182     for(unsigned int kx=0;kx<N;++kx)
00183     {
00184         for(unsigned int ky=0;ky<N;++ky)
00185         {
00186             for(unsigned int kz=0;kz<size_z();++kz)
00187             {
00188 
00189 
00190                 //******************************************************//
00191                 //******************************************************//
00192                 //**********  TO DO : Rotation                 *********//
00193                 //******************************************************//
00194                 //******************************************************//
00195                 double x0=kx;
00196                 double y0=ky;
00197                 double z0=kz;
00198                 //******************************************************//
00199                 //******************************************************//
00200                 //**********  /TO DO :                         *********//
00201                 //******************************************************//
00202                 //******************************************************//
00203 
00204                 double f=(*this)(x0,y0,z0);
00205                 v2.set_data(kx,ky,kz,f);
00206             }
00207         }
00208     }
00209 
00210     return v2;
00211 
00212 }
00213 
00214 
00215 std::vector<float> Volume::mip() const
00216 {
00217     std::vector<float> proj(size_y()*size_z());
00218     for(unsigned int ky=0;ky<size_y();++ky)
00219     {
00220         for(unsigned int kz=0;kz<size_z();++kz)
00221         {
00222             //******************************************************//
00223             //******************************************************//
00224             //**********  TO DO : MIP                      *********//
00225             //******************************************************//
00226             //******************************************************//
00227             proj[ky+size_y()*kz]=get_data(size_x()/2.0,ky,kz);
00228             //******************************************************//
00229             //******************************************************//
00230             //**********  /TO DO :                         *********//
00231             //******************************************************//
00232             //******************************************************//
00233         }
00234     }
00235     return proj;
00236 }
00237 
00238 std::vector<std::vector<float> > Volume::ray_cast() const
00239 {
00240     std::vector<std::vector<float> >proj;
00241 
00242     proj.resize(3);
00243     proj[0].resize(size_y()*size_z());
00244     proj[1].resize(size_y()*size_z());
00245     proj[2].resize(size_y()*size_z());
00246 
00247     //******************************************************//
00248     //******************************************************//
00249     //**********  TO DO : Ray Casting              *********//
00250     //******************************************************//
00251     //******************************************************//
00252     for(unsigned int ky=0;ky<size_y();++ky)
00253     {
00254         for(unsigned int kz=0;kz<size_z();++kz)
00255         {
00256             proj[0][ky+size_y()*kz]=get_data(size_x()/2.0-2,ky,kz);
00257             proj[1][ky+size_y()*kz]=get_data(size_x()/2.0,ky,kz);
00258             proj[2][ky+size_y()*kz]=get_data(size_x()/2.0+2,ky,kz);
00259         }
00260     }
00261     //******************************************************//
00262     //******************************************************//
00263     //**********  /TO DO :                         *********//
00264     //******************************************************//
00265     //******************************************************//
00266 
00267     return proj;
00268 }
00269 
00270 Volume Volume::smoothed() const
00271 {
00272     Volume v2;v2.resize(size_x(),size_y(),size_z());
00273 
00274     for(unsigned int kx=1;kx<size_x()-1;++kx)
00275     {
00276         for(unsigned int ky=1;ky<size_y()-1;++ky)
00277         {
00278             for(unsigned int kz=1;kz<size_z()-1;++kz)
00279             {
00280                 double f=get_data(kx  ,ky,kz);
00281 
00282                 double fx0=get_data(kx-1,ky,kz);
00283                 double fx2=get_data(kx+1,ky,kz);
00284 
00285                 double fy0=get_data(kx,ky-1,kz);
00286                 double fy2=get_data(kx,ky+1,kz);
00287 
00288                 double fz0=get_data(kx,ky,kz-1);
00289                 double fz2=get_data(kx,ky,kz+1);
00290 
00291                 double v=1/12.0*(6*f+fx0+fx2+fy0+fy2+fz0+fz2);
00292 
00293                 v2.set_data(kx,ky,kz,v);
00294             }
00295         }
00296     }
00297     return v2;
00298 }
00299 

Generated on Sun Jan 24 21:30:26 2010 by  doxygen 1.6.1