// ------------------------------------------------------------------------- // @author Leonardo Florez-Valencia (florez-l@javeriana.edu.co) // ------------------------------------------------------------------------- #ifndef __cpExtensions__Algorithms__PolyLineParametricPathWriter__hxx__ #define __cpExtensions__Algorithms__PolyLineParametricPathWriter__hxx__ #include // ------------------------------------------------------------------------- template< class _TPolyLine > void cpExtensions::Algorithms::PolyLineParametricPathWriter< _TPolyLine >:: SetInput( const _TPolyLine* input ) { this->itk::ProcessObject::SetNthInput( 0, const_cast< _TPolyLine* >( input ) ); } // ------------------------------------------------------------------------- template< class _TPolyLine > const _TPolyLine* cpExtensions::Algorithms::PolyLineParametricPathWriter< _TPolyLine >:: GetInput( ) { return( dynamic_cast< const _TPolyLine* >( this->itk::ProcessObject::GetInput( 0 ) ) ); } // ------------------------------------------------------------------------- template< class _TPolyLine > void cpExtensions::Algorithms::PolyLineParametricPathWriter< _TPolyLine >:: Update( ) { _TPolyLine* input = const_cast< _TPolyLine* >( this->GetInput( ) ); if( input != NULL ) { input->UpdateOutputInformation( ); input->UpdateOutputData( ); this->GenerateData( ); this->ReleaseInputs( ); } // fi } // ------------------------------------------------------------------------- template< class _TPolyLine > cpExtensions::Algorithms::PolyLineParametricPathWriter< _TPolyLine >:: PolyLineParametricPathWriter( ) : Superclass( ), m_FileName( "" ), m_NumberOfPoints( 100 ) { this->SetNumberOfRequiredInputs( 1 ); } // ------------------------------------------------------------------------- template< class _TPolyLine > cpExtensions::Algorithms::PolyLineParametricPathWriter< _TPolyLine >:: ~PolyLineParametricPathWriter( ) { } // ------------------------------------------------------------------------- template< class _TPolyLine > void cpExtensions::Algorithms::PolyLineParametricPathWriter< _TPolyLine >:: GenerateData( ) { typedef typename _TPolyLine::TContinuousIndex _TContinuousIndex; // "Serialize" data const _TPolyLine* input = this->GetInput( ); unsigned int dim = _TPolyLine::PathDimension; std::stringstream buffer; long step = input->GetSize( ) / this->m_NumberOfPoints; for( unsigned long i = 0; i < input->GetSize( ); i += step ) { _TContinuousIndex idx; idx.Fill( 0 ); int c = 0; for( long j = -step; j <= step; ++j ) { long k = i + j; if( k >= 0 && k < input->GetSize( ) ) { _TContinuousIndex kdx = input->GetContinuousVertex( k ); for( unsigned int d = 0; d < dim; ++d ) idx[ d ] += kdx[ d ]; c++; } // fi } // rof if( c != 0 ) for( unsigned int d = 0; d < dim; ++d ) idx[ d ] /= c; buffer << idx[ 0 ]; for( unsigned int d = 1; d < dim; ++d ) buffer << " " << idx[ d ]; buffer << std::endl; } // rof // Real write std::ofstream file_stream( this->m_FileName.c_str( ), std::ofstream::binary ); if( !file_stream ) { itkExceptionMacro( << "Could not open file \"" << this->m_FileName << "\" to write a " << "cpExtensions::DataStructures::PolyLineParametricPath< " << dim << " > object." ); return; } // fi file_stream.write( buffer.str( ).c_str( ), buffer.str( ).size( ) ); } #endif // __cpExtensions__Algorithms__PolyLineParametricPathWriter__hxx__ // eof - $RCSfile$