]> Creatis software - cpPlugins.git/blobdiff - lib/cpExtensions/Algorithms/CPRImageFilter.hxx
...
[cpPlugins.git] / lib / cpExtensions / Algorithms / CPRImageFilter.hxx
index b2b8d969b1a6e69a8bfcbd7060f8c270c1e892e4..de76e7fd266e755d5327cd80c6fcb578f563f558 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef __cpExtensions__Algorithms__CPRImageFilter__hxx__
 #define __cpExtensions__Algorithms__CPRImageFilter__hxx__
 
-#include <itkImageRegionIterator.h>
-#include <itkImageSliceIteratorWithIndex.h>
 #include <itkMinimumMaximumImageCalculator.h>
 
 // -------------------------------------------------------------------------
@@ -72,9 +70,7 @@ template< class _TImage, class _TCurve >
 void cpExtensions::Algorithms::CPRImageFilter< _TImage, _TCurve >::
 GenerateData( )
 {
-  typedef itk::MinimumMaximumImageCalculator< _TImage >           _TMinMax;
-  typedef itk::ImageSliceIteratorWithIndex< _TImage >               _T3DIt;
-  typedef itk::ImageRegionIterator< typename TSlicer::TSliceImage > _T2DIt;
+  typedef itk::MinimumMaximumImageCalculator< _TImage > _TMinMax;
 
   auto input = this->GetInput( );
   auto curve = this->GetCurve( );
@@ -85,50 +81,45 @@ GenerateData( )
   minmax->SetImage( input );
   minmax->Compute( );
 
-  // Prepare slicer
-  typename TSlicer::Pointer slicer = TSlicer::New( );
-  slicer->SetInput( input );
-  slicer->SetDefaultValue( minmax->GetMinimum( ) );
-  slicer->SpacingFromMinimumOn( );
-  if( this->m_Interpolator.IsNotNull( ) )
-    slicer->SetInterpolator( this->m_Interpolator );
-  slicer->SizeFromMaximumOff( );
-  if( this->m_SliceRadius > double( 0 ) )
-  {
-    slicer->SizeFromMinimumOff( );
-    slicer->SetSize( this->m_SliceRadius );
-  }
-  else
-    slicer->SizeFromMinimumOn( );
-
-  // Slice image
-  _T3DIt oIt( output, output->GetRequestedRegion( ) );
-  oIt.SetFirstDirection( 1 );
-  oIt.SetSecondDirection( 2 );
-  oIt.GoToBegin( );
+  // Main loop
+  this->m_Join = TJoinFilter::New( );
+  this->m_Slicers.clear( );
   unsigned long N = curve->GetNumberOfPoints( );
+  double len = 0;
+  typename _TCurve::TPoint p, q;
   for( unsigned long n = 0; n < N; ++n )
   {
-    slicer->SetTranslation( curve->GetPoint( n ) );
+    p = curve->GetPoint( n );
+    if( n > 0 )
+      len += p.EuclideanDistanceTo( q );
+    q = p;
+
+    // Prepare slicer
+    typename TSlicer::Pointer slicer = TSlicer::New( );
+    slicer->SetInput( input );
+    slicer->SetDefaultValue( minmax->GetMinimum( ) );
+    slicer->SpacingFromMinimumOn( );
+    if( this->m_Interpolator.IsNotNull( ) )
+      slicer->SetInterpolator( this->m_Interpolator );
+    slicer->SizeFromMaximumOff( );
+    if( this->m_SliceRadius > double( 0 ) )
+    {
+      slicer->SizeFromMinimumOff( );
+      slicer->SetSize( this->m_SliceRadius );
+    }
+    else
+      slicer->SizeFromMinimumOn( );
+    slicer->SetTranslation( p );
     slicer->SetRotation( curve->GetFrame( n ) );
     slicer->Update( );
 
-    // Fill output image
-    _T2DIt sIt(
-      slicer->GetOutput( ), slicer->GetOutput( )->GetRequestedRegion( )
-      );
-    for( sIt.GoToBegin( ); !sIt.IsAtEnd( ); ++sIt )
-    {
-      oIt.Set( sIt.Get( ) );
-      ++oIt;
-      if( oIt.IsAtEndOfLine( ) )
-        oIt.NextLine( );
-      if( oIt.IsAtEndOfSlice( ) )
-        oIt.NextSlice( );
-
-    } // rof
+    this->m_Join->SetInput( n, slicer->GetOutput( ) );
+    this->m_Slicers.push_back( slicer );
 
   } // rof
+  this->m_Join->SetSpacing( len / double( N ) );
+  this->m_Join->Update( );
+  this->GetOutput( )->Graft( this->m_Join->GetOutput( ) );
 }
 
 #endif // __cpExtensions__Algorithms__CPRImageFilter__hxx__