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
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
00135
00136
00137 f=get_data(x0,y0,z0);
00138
00139
00140
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
00193
00194
00195 double x0=kx;
00196 double y0=ky;
00197 double z0=kz;
00198
00199
00200
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
00225
00226
00227 proj[ky+size_y()*kz]=get_data(size_x()/2.0,ky,kz);
00228
00229
00230
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
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
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