113 ASSERT( thing->getSizeT() == (*_ref)->getSizeT() && thing->getBorders()[0] == 0 );
115 Motion dirMotion = motion;
116 std::unique_ptr<Motion> invMotion = motion.
inverse();
119 Point3df sizeFrom( (*_ref)->getVoxelSize() );
120 Point3df sizeTo( thing->getVoxelSize() );
121 dirMotion.
scale( sizeFrom, sizeTo );
122 invMotion->scale( sizeTo, sizeFrom );
127 std::cout <<
"Sampling volume [ 0] / slice [ 0]" << std::flush;
129 for (
int t = 0; t < thing->getSizeT(); t++ )
131 Point3df start = invMotion->translation();
132 for (
int s = 0; s < thing->getSizeZ(); s++ )
135 std::cout <<
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"
136 << std::setw( 3 ) << t <<
"] / slice ["
137 << std::setw( 3 ) << s <<
"]" << std::flush;
139 it = &thing->at( 0, 0, s, t );
140 _sliceResamp( thing, it, start, t, invMotion->rotation() );
141 start[ 0 ] += invMotion->rotation()( 0, 2 );
142 start[ 1 ] += invMotion->rotation()( 1, 2 );
143 start[ 2 ] += invMotion->rotation()( 2, 2 );
147 std::cout << std::endl;
165 int dimX1 = (*_ref)->getSizeX();
168 int dimX2 = resamp->getSizeX();
169 int dimY2 = resamp->getSizeY();
171 const int SIXTEEN = 16;
172 const int TWO_THEN_SIXTEEN = 65536;
176 int maxX = TWO_THEN_SIXTEEN * ( dimX1 - 1 );
177 int maxY = TWO_THEN_SIXTEEN * ( (*_ref)->getSizeY() - 1 );
178 int maxZ = TWO_THEN_SIXTEEN * ( (*_ref)->getSizeZ() - 1 );
184 int xLinCurrent = ( int )( 65536.0 * start[ 0 ] );
185 int yLinCurrent = ( int )( 65536.0 * start[ 1 ] );
186 int zLinCurrent = ( int )( 65536.0 * start[ 2 ] );
191 int xu = ( int )( 65536.0 * Rinv->at( 0, 0 ) );
192 int yu = ( int )( 65536.0 * Rinv->at( 1, 0 ) );
193 int zu = ( int )( 65536.0 * Rinv->at( 2, 0 ) );
194 int xv = ( int )( 65536.0 * Rinv->at( 0, 1 ) );
195 int yv = ( int )( 65536.0 * Rinv->at( 1, 1 ) );
196 int zv = ( int )( 65536.0 * Rinv->at( 2, 1 ) );
206 int xCurrent, yCurrent, zCurrent;
208 int incr_vois[8] = { 0,
209 int( &(*_ref)->at( 1 ) - &(*_ref)->at( 0 ) ),
210 int( &(*_ref)->at( 1, 1 ) - &(*_ref)->at( 0 ) ),
211 int( &(*_ref)->at( 0, 1 ) - &(*_ref)->at( 0 ) ),
212 int( &(*_ref)->at( 0, 0, 1 ) - &(*_ref)->at( 0 ) ),
213 int( &(*_ref)->at( 1, 0, 1 ) - &(*_ref)->at( 0 ) ),
214 int( &(*_ref)->at( 1, 1, 1 ) - &(*_ref)->at( 0 ) ),
215 int( &(*_ref)->at( 0, 1, 1 ) - &(*_ref)->at( 0 ) ) };
220 for (
int v = dimY2; v--;) {
221 xCurrent = xLinCurrent;
222 yCurrent = yLinCurrent;
223 zCurrent = zLinCurrent;
225 for (
int u = dimX2; u--;) {
228 if (xCurrent >= 0 && (xCurrent <= maxX) &&
229 yCurrent >= 0 && (yCurrent <= maxY) &&
230 zCurrent >= 0 && (zCurrent <= maxZ)) {
232 it = &(*_ref)->at(xCurrent >> SIXTEEN,
237 if (*(it + incr_vois[0]) == -32768 ||
238 ((xCurrent < maxX) && *(it + incr_vois[1]) == -32768) ||
239 ((xCurrent < maxX) && (yCurrent < maxY) && *(it + incr_vois[2]) == -32768) ||
240 ((yCurrent < maxY) && *(it + incr_vois[3]) == -32768) ||
241 ((zCurrent < maxZ) && *(it + incr_vois[4]) == -32768) ||
242 ((xCurrent < maxX) && (zCurrent < maxZ) && *(it + incr_vois[5]) == -32768) ||
243 ((xCurrent < maxX) && (yCurrent < maxY) && (zCurrent < maxZ) && *(it + incr_vois[6]) == -32768) ||
244 ((yCurrent < maxY) && (zCurrent < maxZ) && *(it + incr_vois[7]) == -32768)) {
252 out->
x = xCurrent & 0xffff;
253 out->
y = yCurrent & 0xffff;
254 out->
z = zCurrent & 0xffff;
256 out->
offset = &(*_ref)->at( xCurrent >> SIXTEEN,
258 zCurrent >> SIXTEEN ) - &(*_ref)->at( 0 );
278 std::vector< PVVectorItem >& thing,
281 const int TWO_THEN_SIXTEEN = 65536;
288 Motion dirMotion = motion;
289 std::unique_ptr<Motion> invMotion = motion.
inverse();
293 Point3df sizeFrom( (*_ref)->getVoxelSize() );
296 dirMotion.
scale( sizeFrom, sizeTo );
297 invMotion->scale( sizeTo, sizeFrom );
299 typename aims::BucketMap<T>::Bucket::const_iterator
300 it = model.begin()->second.begin() ;
303 int nbOfVoxels = model.begin()->second.size() ;
305 thing.reserve(nbOfVoxels) ;
306 thing.resize(nbOfVoxels) ;
310 float transl0 = invMotion->translation()[0];
311 float transl1 = invMotion->translation()[1];
312 float transl2 = invMotion->translation()[2];
314 invMotion->setTranslation( 0. );
316 x = invMotion->transform( 1.F, 0.F, 0.F ) ;
317 y = invMotion->transform( 0.F, 1.F, 0.F ) ;
318 z = invMotion->transform( 0.F, 0.F, 1.F ) ;
320 int maxX = (*_ref)->getSizeX() - 1;
321 int maxY = (*_ref)->getSizeY() - 1;
322 int maxZ = (*_ref)->getSizeZ() - 1;
323 int oS= &(*_ref)->at( 0, 0, 1 ) - &(*_ref)->at( 0 ),
324 dX = &(*_ref)->at( (*_ref)->getSizeX() ) - &(*_ref)->at( 0 );
326 for(
int i = 0 ; i < nbOfVoxels ; ++i , ++it )
328 float current0, current1, current2;
329 current0 =
static_cast<float>( (it->first)[0] ) ;
330 current1 =
static_cast<float>( (it->first)[1] ) ;
331 current2 =
static_cast<float>( (it->first)[2] ) ;
333 float tmp0 = current0 * x[0] + current1 * y[0] + current2 * z[0] + transl0 ;
334 float tmp1 = current0 * x[1] + current1 * y[1] + current2 * z[1] + transl1 ;
335 float tmp2 = current0 * x[2] + current1 * y[2] + current2 * z[2] + transl2 ;
338 if ( tmp0 >= 0 && tmp0 < maxX &&
339 tmp1 >= 0 && tmp1 < maxY &&
340 tmp2 >= 0 && tmp2 < maxZ)
342 item.
x = (
unsigned short) (( tmp0 -
int(tmp0) ) * TWO_THEN_SIXTEEN);
343 item.
y = (
unsigned short) (( tmp1 -
int(tmp1) ) * TWO_THEN_SIXTEEN);
344 item.
z = (
unsigned short) (( tmp2 -
int(tmp2) ) * TWO_THEN_SIXTEEN);
345 item.
offset = int(tmp2) * oS +
367 long inx = out->getSizeX(),
368 iny = out->getSizeY(),
369 inz = out->getSizeZ();
371 const int TWO_THEN_SIXTEEN = 65536;
372 const float TWO_THEN_SIXTEEN_CUBE = 65536.0 * 65536.0 * 65536.0;
380 std::vector<long> instr = in->getStrides();
382 for( ; !it.
ended(); ++it, ++it1 )
384 z = it->
offset / instr[2];
385 y = (it->
offset % instr[2]) / instr[1];
386 x = (it->
offset % instr[1]) / instr[0];
388 inptr = &in->at(0) + it->
offset;
390 (float)(TWO_THEN_SIXTEEN - it->x) *
391 (float)(TWO_THEN_SIXTEEN - it->y) *
392 (float)(TWO_THEN_SIXTEEN - it->z);
398 (float)(TWO_THEN_SIXTEEN - it->y) *
399 (float)(TWO_THEN_SIXTEEN - it->z);
408 (float)(TWO_THEN_SIXTEEN - it->z);
414 (float)(TWO_THEN_SIXTEEN - it->x) *
416 (float)(TWO_THEN_SIXTEEN - it->z);
420 inptr += instr[2] - instr[1];
421 tmp += (float)(TWO_THEN_SIXTEEN - it->x) *
422 (float)(TWO_THEN_SIXTEEN - it->y)*
431 (float)(TWO_THEN_SIXTEEN - it->y) *
449 (float)(TWO_THEN_SIXTEEN - it->x) *
454 *it1 = (short)(tmp / TWO_THEN_SIXTEEN_CUBE);