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]));
104 weightY0 = getBSplineWeight( y, normalizedInLocation[1] );
105 foldY0 = (long)this->getFold( y, dims[1] ) * dims[0];
109 weightY1 = getBSplineWeight( y, normalizedInLocation[1] );
110 foldY1 = (long)this->getFold( y, dimy ) * dimx;
113 int x =
static_cast<long>(floor(normalizedInLocation[0]));
114 weightX0 = getBSplineWeight( x, normalizedInLocation[0] );
115 foldX0 = (long)this->getFold( x, dimx );
119 weightX1 = getBSplineWeight( x, normalizedInLocation[0] );
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) );
152 intensity = getBSplineWeight( z, normalizedInLocation[2] ) * qj;
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) );
166 intensity += getBSplineWeight( z, normalizedInLocation[2] ) * qj;
175 outValue = outBackground;
185 x = fabs( x - (
double )i );
186 return ( x > 1.0 ) ? 0.0 : 1.0 - x;
double getBSplineWeight(int i, double x) const CARTO_OVERRIDE
Returns .
int getOrder() const CARTO_OVERRIDE
Spline order (1 to 7)
void doResampleChannel(const carto::Volume< ChannelType > &inVolume, const soma::Transformation3d &transform3d, const ChannelType &outBackground, const Point3df &outLocation, ChannelType &outValue, int t) const CARTO_OVERRIDE
B-Spline-based resampling.
void convert(const INP &in, OUTP &out) const
std::vector< int > getSize() const
const T & at(long x, long y=0, long z=0, long t=0) const