00001 //------------------------------------------------------------------------ 00002 // 00003 // Joe Kniss 00004 // 4-1-03 00005 // ________ ____ ___ 00006 // | \ / | / / 00007 // +---+ \/ |/ / 00008 // +--+| |\ /| < 00009 // | || | \ / | |\ \ 00010 // | | \/ | | \ \ 00011 // \_____| |__| \__\ 00012 // Copyright 2003 00013 // Joe Michael Kniss 00014 // <<< jmk@cs.utah.edu >>> 00015 // "All Your Base are Belong to Us" 00016 //------------------------------------------------------------------------- 00017 00018 //nrroKernel.cpp 00019 00020 #include "nrroKernel.h" 00021 #include <iostream> 00022 00023 using namespace std; 00024 00025 00026 00027 ///////////////////////////////////////////////////////////////////// 00028 //usefull predefined kernels 00029 ///////////////////////////////////////////////////////////////////// 00030 00031 const double CatRomParam[NrroKernel::MAX_PARMS] = {1, 0.0, 0.5}; 00032 const NrroKernel CatmulRomKernel(NrroKernel::Cubic, CatRomParam); 00033 00034 const double BSplineParam[NrroKernel::MAX_PARMS] = {1, 1.0, 0.0}; 00035 const NrroKernel BSplineKernel(NrroKernel::Cubic, BSplineParam); 00036 00037 const NrroKernel BoxKernel(NrroKernel::Box); 00038 00039 const NrroKernel TentKernel(NrroKernel::Tent); 00040 00041 /////////////////////////////////////////////////////////////////////////// 00042 /////////////////////////////////////////////////////////////////////////// 00043 // NrroKernel 00044 /////////////////////////////////////////////////////////////////////////// 00045 /////////////////////////////////////////////////////////////////////////// 00046 00047 NrroKernel::NrroKernel(int kind, const double *params) 00048 : _kind(kind) 00049 { 00050 00051 _params[0] = 1; 00052 _spareParams[0] = 1; 00053 for(int i=1; i<MAX_PARMS; ++i) 00054 { 00055 _spareParams[i] = 0; 00056 _params[i] = 0; 00057 } 00058 if(params) 00059 { 00060 for(int j=1; j<MAX_PARMS; ++j) 00061 { 00062 _params[j] = params[j]; 00063 } 00064 } 00065 else if(Cubic == kind) //using default, catmul-rom 00066 { 00067 for(int j=1; j<MAX_PARMS; ++j) 00068 { 00069 _params[j] = CatRomParam[j]; 00070 } 00071 } 00072 00073 if(Tent == kind) //using cubic DD for tent DD 00074 { 00075 _spareParams[1] = 1.0; 00076 _spareParams[2] = 0.0; 00077 } 00078 00079 } 00080 00081 //copy constructor 00082 NrroKernel::NrroKernel(const NrroKernel &nk) 00083 : _kind(nk._kind) 00084 { 00085 for(int i=0; i<MAX_PARMS; ++i) 00086 { 00087 _params[i] = nk._params[i]; 00088 _spareParams[i] = nk._spareParams[i]; 00089 } 00090 } 00091 00092 //assignment operator 00093 void NrroKernel::operator=(const NrroKernel &nk) 00094 { 00095 _kind = nk._kind; 00096 00097 for(int i=0; i<MAX_PARMS; ++i) 00098 { 00099 _params[i] = nk._params[i]; 00100 _spareParams[i] = nk._spareParams[i]; 00101 } 00102 } 00103 00104 NrroKernel::~NrroKernel() 00105 { 00106 00107 } 00108 00109 /////////////////////////////////////////////////////////////////////////// 00110 //getGageKernelType 00111 /////////////////////////////////////////////////////////////////////////// 00112 int NrroKernel::getGageKernelType(int type) const 00113 { 00114 00115 switch(type) 00116 { 00117 case VALUE: 00118 return gageKernel00; 00119 case DERIV: 00120 return gageKernel11; 00121 case DERIV2: 00122 return gageKernel22; 00123 }; 00124 00125 return 0; 00126 } 00127 00128 /////////////////////////////////////////////////////////////////////////// 00129 //getNrrdKernel 00130 /////////////////////////////////////////////////////////////////////////// 00131 NrrdKernel *NrroKernel::getNrrdKernel(int type) const 00132 { 00133 switch(_kind) 00134 { 00135 case Box: 00136 switch(type) 00137 { 00138 case VALUE: 00139 return nrrdKernelBox; 00140 case DERIV: 00141 return nrrdKernelCentDiff; 00142 case DERIV2: 00143 return nrrdKernelBCCubicDD; 00144 }; 00145 case Tent: 00146 switch(type) 00147 { 00148 case VALUE: 00149 return nrrdKernelTent; 00150 case DERIV: 00151 return nrrdKernelCentDiff; 00152 case DERIV2: 00153 return nrrdKernelBCCubicDD; 00154 } 00155 case Cubic: 00156 switch(type) 00157 { 00158 case VALUE: 00159 return nrrdKernelBCCubic; 00160 case DERIV: 00161 return nrrdKernelBCCubicD; 00162 case DERIV2: 00163 return nrrdKernelBCCubicDD; 00164 } 00165 case Quartic: 00166 switch(type) 00167 { 00168 case VALUE: 00169 return nrrdKernelAQuartic; 00170 case DERIV: 00171 return nrrdKernelAQuarticD; 00172 case DERIV2: 00173 return nrrdKernelAQuarticDD; 00174 } 00175 case Gaussian: 00176 switch(type) 00177 { 00178 case VALUE: 00179 return nrrdKernelGaussian; 00180 case DERIV: 00181 return nrrdKernelGaussianD; 00182 case DERIV2: 00183 return nrrdKernelGaussianDD; 00184 }; 00185 break; 00186 default: 00187 cerr << "NrroKernel::getNrrdKernel, Error, Kernel Type Unknown" << endl; 00188 } 00189 00190 return 0; 00191 } 00192 00193 const double *NrroKernel::getParams(int type) const 00194 { 00195 if((Box == _kind || Tent == _kind) && DERIV2 == type) 00196 { 00197 return _spareParams; 00198 } 00199 00200 return _params; 00201 } 00202 00203