]> Creatis software - cpPlugins.git/blobdiff - lib/ivq/VTK/PolyDataToFourierSeriesFilter.cxx
...
[cpPlugins.git] / lib / ivq / VTK / PolyDataToFourierSeriesFilter.cxx
diff --git a/lib/ivq/VTK/PolyDataToFourierSeriesFilter.cxx b/lib/ivq/VTK/PolyDataToFourierSeriesFilter.cxx
new file mode 100644 (file)
index 0000000..b9d6a6a
--- /dev/null
@@ -0,0 +1,151 @@
+// =========================================================================
+// @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$