35 #ifndef AIMS_RESAMPLING_LINEARRESAMPLER_D_H 36 #define AIMS_RESAMPLING_LINEARRESAMPLER_D_H 82 normalizedInLocation = invTransform3d.
transform( outLocation );
84 float xf = round(normalizedInLocation[0]);
85 float yf = round(normalizedInLocation[1]);
86 float zf = round(normalizedInLocation[2]);
88 std::vector<int> dims = inVolume.
getSize();
89 int dimx = dims[0], dimy = dims[1], dimz = dims[2];
93 if ( ( xf >= 0 ) && ( xf < dimx ) &&
94 ( yf >= 0 ) && ( yf < dimy ) &&
95 ( zf >= 0 ) && ( zf < dimz ) )
98 double weightX0, weightY0, weightX1, weightY1;
99 long foldX0, foldY0, foldX1, foldY1;
100 double intensity, qi, qj;
103 int y =
static_cast<long>(floor(normalizedInLocation[1]));
105 foldY0 = (long)this->
getFold( y, dims[1] ) * dims[0];
110 foldY1 = (long)this->
getFold( y, dimy ) * dimx;
113 int x =
static_cast<long>(floor(normalizedInLocation[0]));
115 foldX0 = (long)this->
getFold( x, dimx );
120 foldX1 = (long)this->
getFold( x, dimx );
127 pi = pj + (size_t)(foldY0);
128 qi = weightX0 * ( double )*( pi + (
size_t)(foldX0) );
129 qi += weightX1 * ( double )*( pi +
size_t(foldX1) );
132 qi = weightX0 * ( double )*( pi + (
size_t)(foldX0) );
133 qi += weightX1 * ( double )*( pi + (
size_t)(foldX1) );
134 intensity = qj + weightY1 * qi;
141 int z =
static_cast<long>(floor(normalizedInLocation[2]));
142 pj = i + (size_t)(this->
getFold( z, dimz )) * dimx *
144 pi = pj + (size_t)(foldY0);
145 qi = weightX0 * ( double )*( pi + (
size_t)(foldX0) );
146 qi += weightX1 * ( double )*( pi + (
size_t)(foldX1) );
148 pi = pj + (size_t)foldY1;
149 qi = weightX0 * ( double )*( pi + (
size_t)(foldX0) );
150 qi += weightX1 * ( double )*( pi + (
size_t)(foldX1) );
156 pj = i + (size_t)(this->
getFold( z, dimz )) * dimx *
158 pi = pj + (size_t)(foldY0);
159 qi = weightX0 * ( double )*( pi + (
size_t)(foldX0) );
160 qi += weightX1 * ( double )*( pi + (
size_t)(foldX1) );
162 pi = pj + (size_t)(foldY1);
163 qi = weightX0 * ( double )*( pi + (
size_t)(foldX0) );
164 qi += weightX1 * ( double )*( pi + (
size_t)(foldX1) );
175 outValue = outBackground;
185 x = fabs( x - (
double )i );
186 return ( x > 1.0 ) ? 0.0 : 1.0 - x;
const T & at(long x, long y=0, long z=0, long t=0) const
void doResampleChannel(const carto::Volume< ChannelType > &inVolume, const soma::Transformation3d &transform3d, const ChannelType &outBackground, const Point3df &outLocation, ChannelType &outValue, int t) const CARTO_OVERRIDE
std::vector< int > getSize() const
int getFold(int i, int size) const
This method returns a mirror index when needed.
int getOrder() const CARTO_OVERRIDE
Spline order (1 to 7)
double getBSplineWeight(int i, double x) const CARTO_OVERRIDE
Returns .
B-Spline-based resampling.