void fpa::Image::EndPointsFilter< _TDistanceMap, _TCostMap >::
Compute( )
{
- /* TODO
- typedef itk::ImageRegionConstIteratorWithIndex< _TDistanceMap > _TDistMapIt;
- typedef itk::ImageRegionConstIteratorWithIndex< _TCostMap > _TCostMapIt;
- typedef std::multimap< double, TIndex, std::greater< double > > _TQueue;
- typedef typename _TQueue::value_type _TQueueValue;
-
- // Create queue
- _TQueue queue;
- _TDistMapIt dIt(
- this->m_DistanceMap, this->m_DistanceMap->GetRequestedRegion( )
- );
- _TCostMapIt cIt(
- this->m_CostMap, this->m_CostMap->GetRequestedRegion( )
- );
- dIt.GoToBegin( );
- cIt.GoToBegin( );
- for( ; !dIt.IsAtEnd( ) && !cIt.IsAtEnd( ); ++dIt, ++cIt )
- {
- double d = double( dIt.Get( ) );
- if( d > 0 )
- {
- double v = double( cIt.Get( ) ) * d;
- queue.insert( _TQueueValue( v, dIt.GetIndex( ) ) );
+ typedef itk::ImageRegionConstIteratorWithIndex< _TDistanceMap > _TDistMapIt;
+ typedef itk::ImageRegionConstIteratorWithIndex< _TCostMap > _TCostMapIt;
+ typedef std::multimap< double, TIndex, std::greater< double > > _TQueue;
+ typedef typename _TQueue::value_type _TQueueValue;
+
+ // Some values
+ typename _TDistanceMap::RegionType region =
+ this->m_DistanceMap->GetRequestedRegion( );
+
+ // Create queue
+ _TQueue queue;
+ _TDistMapIt dIt( this->m_DistanceMap, region );
+ _TCostMapIt cIt( this->m_CostMap, region );
+ dIt.GoToBegin( );
+ cIt.GoToBegin( );
+ for( ; !dIt.IsAtEnd( ) && !cIt.IsAtEnd( ); ++dIt, ++cIt )
+ {
+ double d = double( dIt.Get( ) );
+ if( d > 0 )
+ {
+ double v = double( cIt.Get( ) ) / d;
+ queue.insert( _TQueueValue( v, dIt.GetIndex( ) ) );
+
+ } // fi
+
+ } // rof
+
+ // BFS from maximum queue
+ TIndices marks;
+ while( queue.size( ) > 0 )
+ {
+ // Get node
+ auto nIt = queue.begin( );
+ auto n = *nIt;
+ queue.erase( nIt );
+ if( marks.find( n.second ) != marks.end( ) )
+ continue;
+
+ // Mark it
+ marks.insert( n.second );
+ this->m_EndPoints.insert( n.second );
+
+ // Get path
+ typename TMST::TPath::Pointer path;
+ this->m_MST->GetPath( path, n.second );
+ for( unsigned long i = 0; i < path->GetSize( ); ++i )
+ {
+ typename TMST::TPath::TContinuousIndex cidx = path->GetVertex( i );
+ typename _TCostMap::PointType cnt;
+ this->m_CostMap->TransformContinuousIndexToPhysicalPoint( cidx, cnt );
+ TIndex idx;
+ this->m_CostMap->TransformPhysicalPointToIndex( cnt, idx );
+ double d = double( this->m_DistanceMap->GetPixel( idx ) );
+
+ /* TODO
+ TIndex idx;
+ for( unsigned int d = 0; d < _TCostMap::ImageDimension; ++d )
+ idx[ d ] = cidx[ d ];
+ */
+
+ } // rof
+
+ // TODO: temporary
+ queue.clear( );
+
+ } // elihw
- } // fi
-
- } // rof
-
- TIndices marks;
+ /* TODO
while( queue.size( ) > 0 )
{
- auto nIt = queue.begin( );
- auto n = *nIt;
- queue.erase( nIt );
-
- if( marks.find( n.second ) == marks.end( ) )
- {
- std::cout << queue.size( ) << " " << n.first << std::endl;
marks.insert( n.second );
this->m_EndPoints.insert( n.second );
auto path = this->m_MST->GetPath( n.second );
double d = double( this->m_DistanceMap->GetPixel( *pIt ) );
d = std::sqrt( std::fabs( d ) );
typename _TCostMap::PointType center;
- this->m_CostMap->TransformIndexToPhysicalPoint( *pIt, center );
+
std::queue< TIndex > q;
TIndices m;