]> Creatis software - FrontAlgorithms.git/blobdiff - lib/fpa/Image/EndPointsFilter.hxx
...
[FrontAlgorithms.git] / lib / fpa / Image / EndPointsFilter.hxx
index e2be58ffb1b3d89fe2da7e47c6c5807f43f29fbf..a4c170ef5b74af9a46b0df03d993da589fb8a2d2 100644 (file)
@@ -29,44 +29,76 @@ template< class _TDistanceMap, class _TCostMap >
 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 );
@@ -76,7 +108,7 @@ Compute( )
      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;