00001 #ifndef HISTOGRAM3D_H
00002 #define HISTOGRAM3D_H
00003
00004 #include <cmath>
00005 #include "parametermap.h"
00006 #include "dataset.h"
00007 #include "objects3d.h"
00008 #include "tnt_array1d.h"
00009 #include "utils.h"
00010
00011
00012
00013
00014 class CHistogram3d: public CDataSet, public CObject3d {
00015
00016 public:
00017
00018 int nx,ny,nz;
00019 double dx,dy,dz;
00020 double xoffset,yoffset,zoffset;
00021 int ixzero,iyzero,izzero;
00022
00023
00024 CHistogram3d(int Nx=0,int Ny=0,int Nz=0,
00025 double Dx=1.,double Dy=1.,double Dz=1.,
00026 double xO=0.5, double yO=0.5, double zO=0.5);
00027 CHistogram3d(const CHistogram3d& a);
00028
00029
00030 bool Read(const parameterMap& m);
00031 bool Write(parameterMap& m);
00032
00033
00034 void CopyState(const CHistogram3d& a);
00035
00036
00037 virtual double getValueCart(double x, double y, double z) const;
00038 virtual double getValueSphr(double r, double theta, double phi) const
00039 {double rho=r*sin(theta);return getValueCart(rho*cos(phi),rho*sin(phi),r*cos(theta));}
00040 virtual double getErrorCart(double x, double y, double z) const;
00041 virtual double getErrorSphr(double r, double theta, double phi) const
00042 {double rho=r*sin(theta);return getErrorCart(rho*cos(phi),rho*sin(phi),r*cos(theta));}
00043
00044
00045 int findBin(double x, double _dx, double _xoffset) const{return iround<double>((x-_xoffset)/_dx);}
00046 int whatIndex(int ix, int iy, int iz) const{return iz*ny*nx+iy*nx+ix;}
00047 bool inThisBin(int ix, int iy, int iz, double x, double y, double z) const;
00048 int whatBin(double x, double y, double z) const;
00049
00050
00051 double midBinX(int ix) const{return ix*dx+xoffset;}
00052 double midBinY(int iy) const{return iy*dy+yoffset;}
00053 double midBinZ(int iz) const{return iz*dz+zoffset;}
00054 Array1D<double> binCenter(int ix,int iy,int iz) const
00055 {Array1D<double> r(3); r[0]=midBinX(ix); r[1]=midBinY(iy); r[2]=midBinZ(iz); return r;}
00056 Array1D<double> binCenter(int i) const
00057 {Array1D<double> r(3); r[0]=midBinX((i%(ny*nx))%nx); r[1]=midBinY((i%(ny*nx))/nx); r[2]=midBinZ(i/(ny*nx)); return r;}
00058
00059
00060 double leftBinEdgeX(int ix) const{return midBinX(ix)-dx/2.;}
00061 double leftBinEdgeY(int iy) const{return midBinY(iy)-dy/2.;}
00062 double leftBinEdgeZ(int iz) const{return midBinZ(iz)-dz/2.;}
00063
00064 double rightBinEdgeX(int ix) const{return midBinX(ix)+dx/2.;}
00065 double rightBinEdgeY(int iy) const{return midBinY(iy)+dy/2.;}
00066 double rightBinEdgeZ(int iz) const{return midBinZ(iz)+dz/2.;}
00067
00068
00069 int flipBin(int i, int _izero) const{int ii=2*_izero-1-i;if(ii<0){return i;}else{return ii;}}
00070 int flipBinX(int ix) const{return flipBin(ix,ixzero);}
00071 int flipBinY(int iy) const{return flipBin(iy,iyzero);}
00072 int flipBinZ(int iz) const{return flipBin(iz,izzero);}
00073
00074
00075 double binVolume(void) const{return dx*dy*dz;}
00076 };
00077
00078 #endif