35 #ifndef AIMS_RESAMPLING_SAMPLER_H
36 #define AIMS_RESAMPLING_SAMPLER_H
47 unsigned short x, y, z;
54 extern template class Volume<PVItem>;
84 unsigned short x, y, z ;
97 std::vector< PVVectorItem >& thing,
109 template <
class T>
inline
115 ASSERT( thing->getSizeT() == (*_ref)->getSizeT() && thing->getBorders()[0] == 0 );
117 Motion dirMotion = motion;
121 Point3df sizeFrom( (*_ref)->getVoxelSize() );
122 Point3df sizeTo( thing->getVoxelSize() );
123 dirMotion.
scale( sizeFrom, sizeTo );
124 invMotion.
scale( sizeTo, sizeFrom );
129 std::cout <<
"Sampling volume [ 0] / slice [ 0]" << std::flush;
131 for (
int t = 0; t < thing->getSizeT(); t++ )
134 for (
int s = 0; s < thing->getSizeZ(); s++ )
137 std::cout <<
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"
138 << std::setw( 3 ) << t <<
"] / slice ["
139 << std::setw( 3 ) << s <<
"]" << std::flush;
141 it = &thing->at( 0, 0, s, t );
142 _sliceResamp( thing, it, start, t, invMotion.
rotation() );
143 start[ 0 ] += invMotion.
rotation()( 0, 2 );
144 start[ 1 ] += invMotion.
rotation()( 1, 2 );
145 start[ 2 ] += invMotion.
rotation()( 2, 2 );
153 template <
class T>
inline
160 int dimX1 = (*_ref)->getSizeX();
161 int dimX2 = resamp->getSizeX();
162 int dimY2 = resamp->getSizeY();
164 const int SIXTEEN = 16;
165 const int TWO_THEN_SIXTEEN = 65536;
167 int maxX = TWO_THEN_SIXTEEN * ( dimX1 - 1 );
168 int maxY = TWO_THEN_SIXTEEN * ( (*_ref)->getSizeY() - 1 );
169 int maxZ = TWO_THEN_SIXTEEN * ( (*_ref)->getSizeZ() - 1 );
171 int xLinCurrent = ( int )( 65536.0 * start[ 0 ] );
172 int yLinCurrent = ( int )( 65536.0 * start[ 1 ] );
173 int zLinCurrent = ( int )( 65536.0 * start[ 2 ] );
175 int xu = ( int )( 65536.0 * Rinv->at( 0, 0 ) );
176 int yu = ( int )( 65536.0 * Rinv->at( 1, 0 ) );
177 int zu = ( int )( 65536.0 * Rinv->at( 2, 0 ) );
178 int xv = ( int )( 65536.0 * Rinv->at( 0, 1 ) );
179 int yv = ( int )( 65536.0 * Rinv->at( 1, 1 ) );
180 int zv = ( int )( 65536.0 * Rinv->at( 2, 1 ) );
182 int xCurrent, yCurrent, zCurrent;
184 int incr_vois[8] = { 0,
185 int( &(*_ref)->at( 1 ) - &(*_ref)->at( 0 ) ),
186 int( &(*_ref)->at( 1, 1 ) - &(*_ref)->at( 0 ) ),
187 int( &(*_ref)->at( 0, 1 ) - &(*_ref)->at( 0 ) ),
188 int( &(*_ref)->at( 0, 0, 1 ) - &(*_ref)->at( 0 ) ),
189 int( &(*_ref)->at( 1, 0, 1 ) - &(*_ref)->at( 0 ) ),
190 int( &(*_ref)->at( 1, 1, 1 ) - &(*_ref)->at( 0 ) ),
191 int( &(*_ref)->at( 0, 1, 1 ) - &(*_ref)->at( 0 ) ) };
192 for (
int v = dimY2; v--; )
194 xCurrent = xLinCurrent;
195 yCurrent = yLinCurrent;
196 zCurrent = zLinCurrent;
198 for (
int u = dimX2; u--; )
200 if ( xCurrent >= 0 && xCurrent < maxX &&
201 yCurrent >= 0 && yCurrent < maxY &&
202 zCurrent >= 0 && zCurrent < maxZ )
204 it = &(*_ref)->at( xCurrent >> SIXTEEN, yCurrent >> SIXTEEN, zCurrent >> SIXTEEN, t );
206 if (*(it + incr_vois[0]) == -32768 ||
207 *(it + incr_vois[1]) == -32768 ||
208 *(it + incr_vois[2]) == -32768 ||
209 *(it + incr_vois[3]) == -32768 ||
210 *(it + incr_vois[4]) == -32768 ||
211 *(it + incr_vois[5]) == -32768 ||
212 *(it + incr_vois[6]) == -32768 ||
213 *(it + incr_vois[7]) == -32768 )
219 out->
x = xCurrent & 0xffff;
220 out->
y = yCurrent & 0xffff;
221 out->
z = zCurrent & 0xffff;
222 out->
offset = &(*_ref)->at( xCurrent >> SIXTEEN, yCurrent >> SIXTEEN,
223 zCurrent >> SIXTEEN ) - &(*_ref)->at( 0 );
241 template <
class T>
inline
244 std::vector< PVVectorItem >& thing,
247 const int TWO_THEN_SIXTEEN = 65536;
254 Motion dirMotion; dirMotion = motion;
259 Point3df sizeFrom( (*_ref)->getVoxelSize() );
262 dirMotion.
scale( sizeFrom, sizeTo );
263 invMotion.
scale( sizeTo, sizeFrom );
266 it = model.begin()->second.begin() ;
269 int nbOfVoxels = model.begin()->second.size() ;
271 thing.reserve(nbOfVoxels) ;
272 thing.resize(nbOfVoxels) ;
282 x = invMotion.
transform( 1.F, 0.F, 0.F ) ;
283 y = invMotion.
transform( 0.F, 1.F, 0.F ) ;
284 z = invMotion.
transform( 0.F, 0.F, 1.F ) ;
286 int maxX = (*_ref)->getSizeX() - 1;
287 int maxY = (*_ref)->getSizeY() - 1;
288 int maxZ = (*_ref)->getSizeZ() - 1;
289 int oS= &(*_ref)->at( 0, 0, 1 ) - &(*_ref)->at( 0 ),
290 dX = &(*_ref)->at( (*_ref)->getSizeX() ) - &(*_ref)->at( 0 );
292 for(
int i = 0 ; i < nbOfVoxels ; ++i , ++it )
294 float current0, current1, current2;
295 current0 =
static_cast<float>( (it->first)[0] ) ;
296 current1 =
static_cast<float>( (it->first)[1] ) ;
297 current2 =
static_cast<float>( (it->first)[2] ) ;
299 float tmp0 = current0 * x[0] + current1 * y[0] + current2 * z[0] + transl0 ;
300 float tmp1 = current0 * x[1] + current1 * y[1] + current2 * z[1] + transl1 ;
301 float tmp2 = current0 * x[2] + current1 * y[2] + current2 * z[2] + transl2 ;
304 if ( tmp0 >= 0 && tmp0 < maxX &&
305 tmp1 >= 0 && tmp1 < maxY &&
306 tmp2 >= 0 && tmp2 < maxZ)
308 item.
x = (
unsigned short) (( tmp0 -
int(tmp0) ) * TWO_THEN_SIXTEEN);
309 item.
y = (
unsigned short) (( tmp1 -
int(tmp1) ) * TWO_THEN_SIXTEEN);
310 item.
z = (
unsigned short) (( tmp2 -
int(tmp2) ) * TWO_THEN_SIXTEEN);
311 item.
offset = int(tmp2) * oS +
void setRef(const carto::rc_ptr< carto::Volume< T > > &ref)
virtual void doit(const Motion &motion, std::vector< PVVectorItem > &thing, const aims::BucketMap< T > &model) const
const carto::rc_ptr< carto::Volume< T > > * _ref
const carto::rc_ptr< carto::Volume< T > > * _ref
virtual void doit(const Motion &motion, carto::rc_ptr< carto::Volume< PVItem > > &thing) const
void _sliceResamp(carto::rc_ptr< carto::Volume< PVItem > > &resamp, PVItem *out, const Point3df &start, int t, const carto::rc_ptr< carto::Volume< float > > &Rinv) const
void setRef(const carto::rc_ptr< carto::Volume< T > > &ref)
reference_wrapper< T > ref(T &ref)