00001 #ifndef vil3d_tricub_interp_h_
00002 #define vil3d_tricub_interp_h_
00003
00004
00005
00006
00007 #include <vcl_cassert.h>
00008 #include <vcl_cstddef.h>
00009 #include <vil3d/vil3d_image_view.h>
00010 #include <vil3d/vil3d_trilin_interp.h>
00011
00012
00013
00014
00015 template<class T>
00016 double vil3d_tricub_interp_raw(double x, double y, double z, const T* data,
00017 vcl_ptrdiff_t xstep, vcl_ptrdiff_t ystep, vcl_ptrdiff_t zstep);
00018
00019
00020
00021
00022
00023 template<class T>
00024 inline double vil3d_tricub_interp_safe(double x, double y, double z, const T* data,
00025 int nx, int ny, int nz,
00026 vcl_ptrdiff_t xstep, vcl_ptrdiff_t ystep, vcl_ptrdiff_t zstep,
00027 T outval=0)
00028 {
00029 if (x<1) return static_cast<double>(outval);
00030 if (y<1) return static_cast<double>(outval);
00031 if (z<1) return static_cast<double>(outval);
00032 if (x>nx-3) return static_cast<double>(outval);
00033 if (y>ny-3) return static_cast<double>(outval);
00034 if (z>nz-3) return static_cast<double>(outval);
00035 return vil3d_tricub_interp_raw(x,y,z,data,xstep,ystep,zstep);
00036 }
00037
00038
00039
00040
00041
00042
00043 template<class T>
00044 inline double vil3d_tricub_interp_assert(double x, double y, double z, const T* data,
00045 int nx, int ny, int nz,
00046 vcl_ptrdiff_t xstep, vcl_ptrdiff_t ystep, vcl_ptrdiff_t zstep)
00047 {
00048 assert (x>=1);
00049 assert (y>=1);
00050 assert (z>=1);
00051 assert (x<=nx-3);
00052 assert (y<=ny-3);
00053 assert (z<=nz-3);
00054 return vil3d_tricub_interp_raw(x,y,z,data,xstep,ystep,zstep);
00055 }
00056
00057
00058
00059
00060
00061 template<class T>
00062 inline double vil3d_tricub_interp_safe_extend(double x, double y, double z,
00063 const T* data,
00064 int nx, int ny, int nz,
00065 vcl_ptrdiff_t xstep, vcl_ptrdiff_t ystep, vcl_ptrdiff_t zstep)
00066 {
00067 if (x<0.9999999) x= 0.0;
00068 else if (x>nx-3.0000001 && x<nx-1.9999999) x=nx-2.0;
00069 else if (x>nx-2.0000001) x=nx-1.0;
00070
00071 if (y<0.9999999) y= 0.0;
00072 else if (y>ny-3.0000001 && y<ny-1.9999999) y=ny-2.0;
00073 else if (y>ny-2.0000001) y=ny-1.0;
00074
00075 if (z<0.9999999) z= 0.0;
00076 else if (z>nz-3.0000001 && z<nz-1.9999999) z=nz-2.0;
00077 else if (z>nz-2.0000001) z=nz-1.0;
00078
00079 return vil3d_tricub_interp_raw(x,y,z,data,xstep,ystep,zstep);
00080 }
00081
00082
00083
00084
00085
00086 template<class T>
00087 double vil3d_tricub_interp_safe_trilinear_extend(double x, double y, double z,
00088 const T* data,
00089 int nx, int ny, int nz,
00090 vcl_ptrdiff_t xstep, vcl_ptrdiff_t ystep, vcl_ptrdiff_t zstep);
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106 #endif // vil3d_tricub_interp_h_