+// =========================================================================
+// @author Leonardo Florez Valencia
+// @email florez-l@javeriana.edu.co
+// =========================================================================
+
+#include <ivq/VTK/ImageToFourierSeriesFilter.h>
+#include <ivq/VTK/PolyDataToFourierSeriesFilter.h>
+#include <vtkImageData.h>
+#include <vtkInformation.h>
+#include <vtkInformationVector.h>
+#include <vtkMarchingSquares.h>
+#include <vtkPolyDataConnectivityFilter.h>
+#include <vtkSmartPointer.h>
+
+// -------------------------------------------------------------------------
+template< class _TFourierSeries >
+typename ivq::VTK::ImageToFourierSeriesFilter< _TFourierSeries >::
+Self* ivq::VTK::ImageToFourierSeriesFilter< _TFourierSeries >::
+New( )
+{
+ return( new Self( ) );
+}
+
+// -------------------------------------------------------------------------
+template< class _TFourierSeries >
+const _TFourierSeries&
+ivq::VTK::ImageToFourierSeriesFilter< _TFourierSeries >::
+GetOutput( ) const
+{
+ return( this->m_FourierSeries );
+}
+
+// -------------------------------------------------------------------------
+template< class _TFourierSeries >
+void ivq::VTK::ImageToFourierSeriesFilter< _TFourierSeries >::
+SetNumberOfHarmonics( unsigned int q )
+{
+ if( this->m_FourierSeries.GetNumberOfHarmonics( ) != q )
+ {
+ this->m_FourierSeries.SetNumberOfHarmonics( q );
+ this->Modified( );
+
+ } // fi
+}
+
+// -------------------------------------------------------------------------
+template< class _TFourierSeries >
+unsigned int ivq::VTK::ImageToFourierSeriesFilter< _TFourierSeries >::
+GetNumberOfHarmonics( ) const
+{
+ return( this->m_FourierSeries.GetNumberOfHarmonics( ) );
+}
+
+// -------------------------------------------------------------------------
+template< class _TFourierSeries >
+const double& ivq::VTK::ImageToFourierSeriesFilter< _TFourierSeries >::
+GetContourValue( ) const
+{
+ return( this->m_ContourValue );
+}
+
+// -------------------------------------------------------------------------
+template< class _TFourierSeries >
+void ivq::VTK::ImageToFourierSeriesFilter< _TFourierSeries >::
+SetContourValue( const double& v )
+{
+ if( this->m_ContourValue != v )
+ {
+ this->m_ContourValue = v;
+ this->Modified( );
+
+ } // fi
+}
+
+// -------------------------------------------------------------------------
+template< class _TFourierSeries >
+ivq::VTK::ImageToFourierSeriesFilter< _TFourierSeries >::
+ImageToFourierSeriesFilter( )
+ : vtkImageAlgorithm( ),
+ m_ContourValue( double( 0 ) )
+{
+ this->SetNumberOfInputPorts( 1 );
+ this->SetNumberOfOutputPorts( 0 );
+ this->m_FourierSeries.SetNumberOfHarmonics( 1 );
+}
+
+// -------------------------------------------------------------------------
+template< class _TFourierSeries >
+ivq::VTK::ImageToFourierSeriesFilter< _TFourierSeries >::
+~ImageToFourierSeriesFilter( )
+{
+}
+
+// -------------------------------------------------------------------------
+template< class _TFourierSeries >
+int ivq::VTK::ImageToFourierSeriesFilter< _TFourierSeries >::
+RequestData(
+ vtkInformation* information,
+ vtkInformationVector** input,
+ vtkInformationVector* output
+ )
+{
+ // Get input polydata
+ vtkInformation* inInfo = input[ 0 ]->GetInformationObject( 0 );
+ vtkImageData* image =
+ vtkImageData::SafeDownCast(
+ inInfo->Get( vtkDataObject::DATA_OBJECT( ) )
+ );
+
+ // Extract contour
+ vtkSmartPointer< vtkMarchingSquares > ms =
+ vtkSmartPointer< vtkMarchingSquares >::New( );
+ ms->SetInputData( image );
+ ms->SetValue( 0, this->m_ContourValue );
+
+ vtkSmartPointer< vtkPolyDataConnectivityFilter > conn =
+ vtkSmartPointer< vtkPolyDataConnectivityFilter >::New( );
+ conn->SetInputConnection( ms->GetOutputPort( ) );
+ conn->SetExtractionModeToClosestPointRegion( );
+ conn->SetClosestPoint( 0, 0, 0 );
+
+ // Compute fourier series
+ typedef ivq::VTK::PolyDataToFourierSeriesFilter< TFourierSeries > _TFilter;
+ vtkSmartPointer< _TFilter > filter = vtkSmartPointer< _TFilter >::New( );
+ filter->SetInputConnection( conn->GetOutputPort( ) );
+ filter->SetNumberOfHarmonics( this->m_FourierSeries.GetNumberOfHarmonics( ) );
+ filter->Update( );
+ this->m_FourierSeries = filter->GetOutput( );
+
+ return( 1 );
+}
+
+// -------------------------------------------------------------------------
+template< class _TFourierSeries >
+int ivq::VTK::ImageToFourierSeriesFilter< _TFourierSeries >::
+RequestInformation(
+ vtkInformation* information,
+ vtkInformationVector** input,
+ vtkInformationVector* output
+ )
+{
+ return( 1 );
+}
+
+// -------------------------------------------------------------------------
+#include <ivq/ITK/FourierSeries.h>
+
+template class ivq::VTK::ImageToFourierSeriesFilter< ivq::ITK::FourierSeries< float, 2 > >;
+template class ivq::VTK::ImageToFourierSeriesFilter< ivq::ITK::FourierSeries< float, 3 > >;
+template class ivq::VTK::ImageToFourierSeriesFilter< ivq::ITK::FourierSeries< double, 2 > >;
+template class ivq::VTK::ImageToFourierSeriesFilter< ivq::ITK::FourierSeries< double, 3 > >;
+
+// eof - $RCSfile$