#define __fpa__Image__Functors__SimpleNeighborhood__hxx__
// -------------------------------------------------------------------------
-template< class _TImage >
-typename fpa::Image::Functors::SimpleNeighborhood< _TImage >::
-TOutput fpa::Image::Functors::SimpleNeighborhood< _TImage >::
+template< unsigned int _VDim >
+typename fpa::Image::Functors::SimpleNeighborhood< _VDim >::
+TOutput fpa::Image::Functors::SimpleNeighborhood< _VDim >::
Evaluate( const TIndex& center ) const
{
- TOutput res;
- typename _TImage::RegionType reg = this->m_Image->GetRequestedRegion( );
- if( this->m_Order == 1 )
+ if( this->m_Offsets.size( ) == 0 )
{
- for( unsigned int d = 0; d < _TImage::ImageDimension; ++d )
- {
- for( int o = -1; o <= 1; o += 2 )
- {
- TIndex idx = center;
- idx[ d ] += o;
- if( reg.IsInside( idx ) )
- res.push_back( idx );
+ if( this->m_Order == 1 )
+ this->_1stCombination( );
+ else
+ this->_2ndCombination( );
- } // rof
+ } // fi
- } // rof
- }
- else
+ TOutput res;
+ typename TImage::RegionType reg = this->m_Image->GetRequestedRegion( );
+ for( int i = 0; i < this->m_Offsets.size( ); ++i )
{
- // TODO!!!
+ TIndex idx = center + this->m_Offsets[ i ];
+ if( reg.IsInside( idx ) && idx != center )
+ res.push_back( idx );
- } // fi
+ } // rof
return( res );
}
// -------------------------------------------------------------------------
-template< class _TImage >
-fpa::Image::Functors::SimpleNeighborhood< _TImage >::
+template< unsigned int _VDim >
+fpa::Image::Functors::SimpleNeighborhood< _VDim >::
SimpleNeighborhood( )
: Superclass( ),
m_Order( 1 )
}
// -------------------------------------------------------------------------
-template< class _TImage >
- fpa::Image::Functors::SimpleNeighborhood< _TImage >::
+template< unsigned int _VDim >
+ fpa::Image::Functors::SimpleNeighborhood< _VDim >::
~SimpleNeighborhood( )
{
}
+// -------------------------------------------------------------------------
+template< unsigned int _VDim >
+void fpa::Image::Functors::SimpleNeighborhood< _VDim >::
+_1stCombination( ) const
+{
+ for( int d = 0; d < TImage::ImageDimension; ++d )
+ {
+ typename TIndex::OffsetType off;
+ off.Fill( 0 );
+ for( int i = -1; i <= 1; i += 2 )
+ {
+ off[ d ] = i;
+ this->m_Offsets.push_back( off );
+
+ } // rof
+
+ } // rof
+}
+
+// -------------------------------------------------------------------------
+template< unsigned int _VDim >
+void fpa::Image::Functors::SimpleNeighborhood< _VDim >::
+_2ndCombination( ) const
+{
+ std::vector< std::vector< std::vector< int > > > M;
+ M.push_back( std::vector< std::vector< int > >( ) );
+
+ std::vector< int > base;
+ base.push_back( -1 );
+ base.push_back( 0 );
+ base.push_back( 1 );
+ int dim = TImage::ImageDimension;
+
+ M.push_back( std::vector< std::vector< int > >( ) );
+ for( int j = 0; j < base.size( ); ++j )
+ M[ 1 ].push_back( std::vector< int >( 1, base[ j ] ) );
+
+ for( int i = 2; i <= dim; ++i )
+ {
+ M.push_back( std::vector< std::vector< int > >( ) );
+ for( int j = 0; j < base.size( ); ++j )
+ {
+ for( int k = 0; k < M[ i - 1 ].size( ); ++k )
+ {
+ M[ i ].push_back( std::vector< int >( 1, base[ j ] ) );
+ for( int l = 0; l < M[ i - 1 ][ k ].size( ); ++l )
+ M[ i ].back( ).push_back( M[ i - 1 ][ k ][ l ] );
+
+ } // rof
+
+ } // rof
+
+ } // rof
+
+ for( int i = 0; i < M[ dim ].size( ); ++i )
+ {
+ TOffset off;
+ for( int j = 0; j < M[ dim ][ i ].size( ); ++j )
+ off[ j ] = M[ dim ][ i ][ j ];
+ this->m_Offsets.push_back( off );
+
+ } // rof
+}
+
#endif // __fpa__Image__Functors__SimpleNeighborhood__hxx__
// eof - $RCSfile$