00001
00002 #ifndef vil3d_sample_profile_trilin_txx_
00003 #define vil3d_sample_profile_trilin_txx_
00004
00005
00006
00007
00008
00009 #include "vil3d_sample_profile_trilin.h"
00010
00011 #include <vil3d/vil3d_trilin_interp.h>
00012
00013 inline bool vil3d_profile_in_image(double x0, double y0, double z0,
00014 double x1, double y1,double z1,
00015 const vil3d_image_view_base& image)
00016 {
00017 if (x0<1) return false;
00018 if (y0<1) return false;
00019 if (z0<1) return false;
00020 if (x0+2>image.ni()) return false;
00021 if (y0+2>image.nj()) return false;
00022 if (z0+2>image.nk()) return false;
00023 if (x1<1) return false;
00024 if (y1<1) return false;
00025 if (z1<1) return false;
00026 if (x1+2>image.ni()) return false;
00027 if (y1+2>image.nj()) return false;
00028 if (z1+2>image.nk()) return false;
00029
00030 return true;
00031 }
00032
00033
00034
00035
00036
00037
00038 template <class imType, class vecType>
00039 void vil3d_sample_profile_trilin(
00040 vecType* v,
00041 const vil3d_image_view<imType>& image,
00042 double x0, double y0, double z0,
00043 double dx, double dy, double dz,
00044 unsigned n)
00045 {
00046 bool all_in_image = vil3d_profile_in_image(x0,y0,z0,
00047 x0+(n-1)*dx,y0+(n-1)*dy,z0+(n-1)*dz,
00048 image);
00049
00050 const unsigned ni = image.ni();
00051 const unsigned nj = image.nj();
00052 const unsigned nk = image.nk();
00053 const unsigned np = image.nplanes();
00054 const vcl_ptrdiff_t istep = image.istep();
00055 const vcl_ptrdiff_t jstep = image.jstep();
00056 const vcl_ptrdiff_t kstep = image.kstep();
00057 const vcl_ptrdiff_t pstep = image.planestep();
00058 double x=x0;
00059 double y=y0;
00060 double z=z0;
00061 const imType* plane0 = image.origin_ptr();
00062
00063 if (all_in_image)
00064 {
00065 if (np==1)
00066 {
00067 for (unsigned h=0;h<n;++h,x+=dx,y+=dy,z+=dz)
00068 v[h] = vil3d_trilin_interp_raw(x,y,z,plane0,istep,jstep,kstep);
00069 }
00070 else
00071 {
00072 for (unsigned h=0;h<n;++h,x+=dx,y+=dy,z+=dz)
00073 {
00074 for (unsigned p=0;p<np;++p,++v)
00075 *v = vil3d_trilin_interp_raw(x,y,z,plane0+p*pstep,istep,jstep,kstep);
00076 }
00077 }
00078 }
00079 else
00080 {
00081
00082 if (np==1)
00083 {
00084 for (unsigned h=0;h<n;++h,x+=dx,y+=dy,z+=dz)
00085 v[h] = vil3d_trilin_interp_safe(x,y,z,plane0,ni,nj,nk,istep,jstep,kstep);
00086 }
00087 else
00088 {
00089 for (unsigned h=0;h<n;++h,x+=dx,y+=dy,z+=dz)
00090 {
00091 for (unsigned p=0;p<np;++p,++v)
00092 *v = vil3d_trilin_interp_safe(x,y,z,plane0+p*pstep,ni,nj,nk,istep,jstep,kstep);
00093 }
00094 }
00095 }
00096 }
00097
00098
00099
00100
00101
00102
00103 template <class imType, class vecType>
00104 void vil3d_sample_profile_trilin_extend(
00105 vecType* v,
00106 const vil3d_image_view<imType>& image,
00107 double x0, double y0, double z0,
00108 double dx, double dy, double dz,
00109 unsigned n)
00110 {
00111 bool all_in_image = vil3d_profile_in_image(x0,y0,z0,
00112 x0+(n-1)*dx,y0+(n-1)*dy,z0+(n-1)*dz,
00113 image);
00114
00115 const unsigned ni = image.ni();
00116 const unsigned nj = image.nj();
00117 const unsigned nk = image.nk();
00118 const unsigned np = image.nplanes();
00119 const vcl_ptrdiff_t istep = image.istep();
00120 const vcl_ptrdiff_t jstep = image.jstep();
00121 const vcl_ptrdiff_t kstep = image.kstep();
00122 const vcl_ptrdiff_t pstep = image.planestep();
00123 double x=x0;
00124 double y=y0;
00125 double z=z0;
00126 const imType* plane0 = image.origin_ptr();
00127
00128 if (all_in_image)
00129 {
00130 if (np==1)
00131 {
00132 for (unsigned h=0;h<n;++h,x+=dx,y+=dy,z+=dz)
00133 v[h] = vil3d_trilin_interp_raw(x,y,z,plane0,istep,jstep,kstep);
00134 }
00135 else
00136 {
00137 for (unsigned h=0;h<n;++h,x+=dx,y+=dy,z+=dz)
00138 {
00139 for (unsigned p=0;p<np;++p,++v)
00140 *v = vil3d_trilin_interp_raw(x,y,z,plane0+p*pstep,istep,jstep,kstep);
00141 }
00142 }
00143 }
00144 else
00145 {
00146
00147 if (np==1)
00148 {
00149 for (unsigned h=0;h<n;++h,x+=dx,y+=dy,z+=dz)
00150 v[h] = vil3d_trilin_interp_safe_extend(x,y,z,plane0,ni,nj,nk,istep,jstep,kstep);
00151 }
00152 else
00153 {
00154 for (unsigned h=0;h<n;++h,x+=dx,y+=dy,z+=dz)
00155 {
00156 for (unsigned p=0;p<np;++p,++v)
00157 *v = vil3d_trilin_interp_safe_extend(x,y,z,plane0+p*pstep,ni,nj,nk,istep,jstep,kstep);
00158 }
00159 }
00160 }
00161 }
00162
00163
00164 #define VIL3D_SAMPLE_PROFILE_TRILIN_INSTANTIATE( imType, vecType ) \
00165 template void vil3d_sample_profile_trilin(vecType* v, \
00166 const vil3d_image_view<imType >& image, \
00167 double x0, double y0, double z0,\
00168 double dx, double dy, double dz,\
00169 unsigned n); \
00170 template void vil3d_sample_profile_trilin_extend(vecType* v, \
00171 const vil3d_image_view<imType >& image, \
00172 double x0, double y0, double z0,\
00173 double dx, double dy, double dz,\
00174 unsigned n)
00175 #endif // vil3d_sample_profile_trilin_txx_