--- /dev/null
+// =========================================================================
+// @author Leonardo Florez Valencia
+// @email florez-l@javeriana.edu.co
+// =========================================================================
+
+#include <ivq/VTK/PolyDataToFourierSeriesFilter.h>
+#include <itkQuadEdgeMesh.h>
+#include <vtkInformation.h>
+#include <vtkInformationVector.h>
+
+// -------------------------------------------------------------------------
+template< class _TFourierSeries >
+typename ivq::VTK::PolyDataToFourierSeriesFilter< _TFourierSeries >::
+Self* ivq::VTK::PolyDataToFourierSeriesFilter< _TFourierSeries >::
+New( )
+{
+ return( new Self( ) );
+}
+
+// -------------------------------------------------------------------------
+template< class _TFourierSeries >
+const _TFourierSeries&
+ivq::VTK::PolyDataToFourierSeriesFilter< _TFourierSeries >::
+GetOutput( ) const
+{
+ return( this->m_FourierSeries );
+}
+
+// -------------------------------------------------------------------------
+template< class _TFourierSeries >
+void ivq::VTK::PolyDataToFourierSeriesFilter< _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::PolyDataToFourierSeriesFilter< _TFourierSeries >::
+GetNumberOfHarmonics( ) const
+{
+ return( this->m_FourierSeries.GetNumberOfHarmonics( ) );
+}
+
+// -------------------------------------------------------------------------
+template< class _TFourierSeries >
+ivq::VTK::PolyDataToFourierSeriesFilter< _TFourierSeries >::
+PolyDataToFourierSeriesFilter( )
+ : vtkPolyDataAlgorithm( )
+{
+ this->SetNumberOfInputPorts( 1 );
+ this->SetNumberOfOutputPorts( 0 );
+ this->m_FourierSeries.SetNumberOfHarmonics( 1 );
+}
+
+// -------------------------------------------------------------------------
+template< class _TFourierSeries >
+ivq::VTK::PolyDataToFourierSeriesFilter< _TFourierSeries >::
+~PolyDataToFourierSeriesFilter( )
+{
+}
+
+// -------------------------------------------------------------------------
+template< class _TFourierSeries >
+int ivq::VTK::PolyDataToFourierSeriesFilter< _TFourierSeries >::
+RequestData(
+ vtkInformation* information,
+ vtkInformationVector** input,
+ vtkInformationVector* output
+ )
+{
+ // Get input polydata
+ vtkInformation* inInfo = input[ 0 ]->GetInformationObject( 0 );
+ vtkPolyData* cnt =
+ vtkPolyData::SafeDownCast(
+ inInfo->Get( vtkDataObject::DATA_OBJECT( ) )
+ );
+
+ // Use quad-edge to order points
+ typedef itk::QuadEdgeMesh< double, 2 > _TQEMesh;
+ typedef _TQEMesh::PointType _T2DPoint;
+ typedef std::vector< _T2DPoint > _T2DPoints;
+ _TQEMesh::Pointer mesh = _TQEMesh::New( );
+ for( unsigned int i = 0; i < cnt->GetNumberOfPoints( ); ++i )
+ {
+ _T2DPoint pnt;
+ double p[ 3 ];
+ cnt->GetPoint( i, p );
+ pnt[ 0 ] = p[ 0 ];
+ pnt[ 1 ] = p[ 1 ];
+ mesh->AddPoint( pnt );
+
+ } // rof
+
+ vtkCellArray* lines = cnt->GetLines( );
+ lines->InitTraversal( );
+ vtkIdType* ids = new vtkIdType[ 2 ];
+ vtkIdType npts;
+ while( lines->GetNextCell( npts, ids ) != 0 )
+ mesh->AddEdge( ids[ 0 ], ids[ 1 ] );
+ delete ids;
+ _TQEMesh::QEPrimal* edge = mesh->GetEdge( );
+ if( edge != NULL )
+ {
+ _T2DPoints points;
+ mesh->AddFace( edge );
+ edge = mesh->GetEdge( );
+ for(
+ _TQEMesh::QEPrimal::IteratorGeom eIt = edge->BeginGeomLnext( );
+ eIt != edge->EndGeomLnext( );
+ ++eIt
+ )
+ points.push_back( mesh->GetPoint( *eIt ) );
+ this->m_FourierSeries =
+ TFourierSeries(
+ points.begin( ), points.end( ),
+ this->m_FourierSeries.GetNumberOfHarmonics( )
+ );
+ this->m_FourierSeries.SetOrderingToCounterClockWise( );
+ }
+ else
+ this->m_FourierSeries *= ( typename _TFourierSeries::TScalar )( 0 );
+ return( 1 );
+}
+
+// -------------------------------------------------------------------------
+template< class _TFourierSeries >
+int ivq::VTK::PolyDataToFourierSeriesFilter< _TFourierSeries >::
+RequestInformation(
+ vtkInformation* information,
+ vtkInformationVector** input,
+ vtkInformationVector* output
+ )
+{
+ return( 1 );
+}
+
+// -------------------------------------------------------------------------
+#include <ivq/ITK/FourierSeries.h>
+
+template class ivq::VTK::PolyDataToFourierSeriesFilter< ivq::ITK::FourierSeries< float, 2 > >;
+template class ivq::VTK::PolyDataToFourierSeriesFilter< ivq::ITK::FourierSeries< float, 3 > >;
+template class ivq::VTK::PolyDataToFourierSeriesFilter< ivq::ITK::FourierSeries< double, 2 > >;
+template class ivq::VTK::PolyDataToFourierSeriesFilter< ivq::ITK::FourierSeries< double, 3 > >;
+
+// eof - $RCSfile$