32 #include "DGtal/kernel/sets/DigitalSetDomain.h"
33 #include "DGtal/topology/DigitalTopology.h"
34 #include "DGtal/topology/MetricAdjacency.h"
35 #include "DGtal/topology/BreadthFirstVisitor.h"
41 #include "DGtal/topology/Object.h"
55 template <
typename TDigitalTopology,
typename TDigitalSet>
58 : myTopo( 0 ), myPointSet( 0 ), myConnectedness(
UNKNOWN )
71 template <
typename TDigitalTopology,
typename TDigitalSet>
79 myConnectedness( cxn )
92 template <
typename TDigitalTopology,
typename TDigitalSet>
98 : myTopo( aTopology ),
100 myConnectedness( cxn )
113 template <
typename TDigitalTopology,
typename TDigitalSet>
116 (
const TDigitalTopology & aTopology,
120 myPointSet( aPointSet ),
121 myConnectedness( cxn )
135 template <
typename TDigitalTopology,
typename TDigitalSet>
138 (
const TDigitalTopology & aTopology,
142 myPointSet( pointSet ),
143 myConnectedness( cxn )
154 template <
typename TDigitalTopology,
typename TDigitalSet>
172 template <
typename TDigitalTopology,
typename TDigitalSet>
175 (
const TDigitalTopology & aTopology,
190 template <
typename TDigitalTopology,
typename TDigitalSet>
195 : myTopo( aTopology ),
204 template <
typename TDigitalTopology,
typename TDigitalSet>
215 template <
typename TDigitalTopology,
typename TDigitalSet>
221 if (
this != &other )
233 template <
typename TDigitalTopology,
typename TDigitalSet>
238 return myPointSet->
size();
244 template <
typename TDigitalTopology,
typename TDigitalSet>
249 return myPointSet->
domain();
257 template <
typename TDigitalTopology,
typename TDigitalSet>
269 template <
typename TDigitalTopology,
typename TDigitalSet>
281 template <
typename TDigitalTopology,
typename TDigitalSet>
283 const TDigitalTopology &
292 template <
typename TDigitalTopology,
typename TDigitalSet>
294 const typename TDigitalTopology::ForegroundAdjacency &
297 return myTopo->kappa();
313 template <
typename TDigitalTopology,
typename TDigitalSet>
319 typedef std::vector<Vertex> Container;
320 typedef typename Container::const_iterator ContainerConstIterator;
321 typedef typename DigitalSet::ConstIterator DigitalSetConstIterator;
324 Container tmp_local_points;
325 std::back_insert_iterator< Container > back_ins_it( tmp_local_points );
326 adjacency().writeNeighbors( back_ins_it, p );
327 tmp_local_points.push_back( p );
331 const ContainerConstIterator it_end( tmp_local_points.end() );
332 const DigitalSetConstIterator not_found( pointSet().end() );
334 for ( ContainerConstIterator it = tmp_local_points.begin();
337 if ( pointSet().find( *it ) != not_found )
352 template <
typename TDigitalTopology,
typename TDigitalSet>
358 typedef std::vector<Vertex> Container;
359 typedef typename Container::const_iterator ContainerConstIterator;
360 typedef typename DigitalSet::ConstIterator DigitalSetConstIterator;
363 Container tmp_local_points;
364 std::back_insert_iterator< Container > back_ins_it( tmp_local_points );
365 adjacency().writeNeighbors( back_ins_it, p );
366 tmp_local_points.push_back( p );
369 const ContainerConstIterator it_end( tmp_local_points.end() );
370 const DigitalSetConstIterator not_found( pointSet().end() );
372 for ( ContainerConstIterator it = tmp_local_points.begin();
375 if ( pointSet().find( *it ) != not_found )
391 template <
typename TDigitalTopology,
typename TDigitalSet>
397 typedef std::vector<Vertex> Container;
398 typedef typename Container::const_iterator ContainerConstIterator;
399 typedef typename DigitalSet::ConstIterator DigitalSetConstIterator;
402 Container tmp_local_points;
403 std::back_insert_iterator< Container > back_ins_it( tmp_local_points );
404 adjacency().writeNeighbors( back_ins_it, p );
408 const ContainerConstIterator it_end( tmp_local_points.end() );
409 const DigitalSetConstIterator not_found( pointSet().end() );
411 for ( ContainerConstIterator it = tmp_local_points.begin();
414 if ( pointSet().find( *it ) != not_found )
430 template <
typename TDigitalTopology,
typename TDigitalSet>
436 typedef std::vector<Vertex> Container;
437 typedef typename Container::const_iterator ContainerConstIterator;
438 typedef typename DigitalSet::ConstIterator DigitalSetConstIterator;
441 Container tmp_local_points;
443 std::back_insert_iterator< Container > back_ins_it( tmp_local_points );
444 adjacency().writeNeighbors( back_ins_it, p );
447 const ContainerConstIterator it_end( tmp_local_points.end() );
448 const DigitalSetConstIterator not_found( pointSet().end() );
450 for ( ContainerConstIterator it = tmp_local_points.begin();
453 if ( pointSet().find( *it ) != not_found )
464 template <
typename TDigitalTopology,
typename TDigitalSet>
469 typedef std::vector<Vertex> Container;
470 typedef typename Container::const_iterator ContainerConstIterator;
471 typedef typename DigitalSet::ConstIterator DigitalSetConstIterator;
472 typedef typename DigitalSet::ConstIterator DigitalSetConstIterator;
482 Container tmp_local_points;
483 const DigitalSetConstIterator it_end = mySet.end();
484 for ( DigitalSetConstIterator it = mySet.begin();
488 std::back_insert_iterator< Container > back_ins_it( tmp_local_points );
490 topology().lambda().writeNeighbors
491 ( back_ins_it, *it, domain().predicate() );
493 const ContainerConstIterator itc_end( tmp_local_points.end() );
494 for ( ContainerConstIterator itc = tmp_local_points.begin();
497 if ( pointSet().find( *itc ) == it_end )
499 outputSet.insertNew( *it );
502 tmp_local_points.clear();
516 template <
typename TDigitalTopology,
typename TDigitalSet>
517 template <
typename OutputObjectIterator>
523 Size nb_components = 0;
524 if ( pointSet().empty() )
527 return nb_components;
535 typedef typename DigitalSet::ConstIterator DigitalSetConstIterator;
536 DigitalSetConstIterator it_object = pointSet().begin();
537 Point p( *it_object++ );
547 while ( it_object != pointSet().end() )
550 if ( visited.find( p ) == visited.end() )
584 return nb_components;
593 template <
typename TDigitalTopology,
typename TDigitalSet>
597 return myConnectedness;
610 template <
typename TDigitalTopology,
typename TDigitalSet>
614 if ( myConnectedness ==
UNKNOWN )
616 if ( pointSet().empty() )
621 Vertex p = *( pointSet().begin() );
627 myConnectedness = ( visitor.
visitedVertices().size() == pointSet().size() )
641 return myConnectedness;
647 template <
typename TDigitalTopology,
typename TDigitalSet>
652 return myPointSet->
begin();
655 template <
typename TDigitalTopology,
typename TDigitalSet>
660 return myPointSet->
end();
668 template <
typename TDigitalTopology,
typename TDigitalSet>
674 return neighborhoodSize( v );
680 template <
typename TDigitalTopology,
typename TDigitalSet>
699 template <
typename TDigitalTopology,
typename TDigitalSet>
700 template <
typename OutputIterator>
707 typedef std::vector<Vertex> Container;
708 typedef typename Container::const_iterator ContainerConstIterator;
709 typedef typename DigitalSet::ConstIterator DigitalSetConstIterator;
712 Container tmp_local_points;
713 std::back_insert_iterator< Container > back_ins_it( tmp_local_points );
714 adjacency().writeNeighbors( back_ins_it, v );
717 const ContainerConstIterator it_end( tmp_local_points.end() );
718 const DigitalSetConstIterator not_found( pointSet().end() );
719 for ( ContainerConstIterator cit = tmp_local_points.begin();
722 if ( pointSet().find( *cit ) != not_found )
742 template <
typename TDigitalTopology,
typename TDigitalSet>
743 template <
typename OutputIterator,
typename VertexPredicate>
749 const VertexPredicate & pred )
const
751 typedef std::vector<Vertex> Container;
752 typedef typename Container::const_iterator ContainerConstIterator;
753 typedef typename DigitalSet::ConstIterator DigitalSetConstIterator;
756 Container tmp_local_points;
757 std::back_insert_iterator< Container > back_ins_it( tmp_local_points );
758 adjacency().writeNeighbors( back_ins_it, v );
761 const ContainerConstIterator it_end( tmp_local_points.end() );
762 const DigitalSetConstIterator not_found( pointSet().end() );
763 for ( ContainerConstIterator cit = tmp_local_points.begin();
766 if ( ( pointSet().find( *cit ) != not_found ) && pred(*cit) )
776 template <
typename TDigitalTopology,
typename TDigitalSet>
777 template <
typename TAdjacency>
782 (
const TAdjacency & adj,
const Point & p,
unsigned int k )
const
785 typedef std::vector<Vertex> Container;
789 typedef typename Container::const_iterator ContainerConstIterator;
790 typedef typename DigitalSet::ConstIterator DigitalSetConstIterator;
795 AlphaAdjacency alpha;
796 OmegaAdjacency omega;
798 Container tmp_local_points;
799 std::back_insert_iterator< Container > back_ins_it( tmp_local_points );
800 alpha.writeNeighbors( back_ins_it, p, limitedX.
predicate() );
804 for (
typename Point::Iterator it = p1.begin(); it != p1.end(); ++it )
807 for (
typename Point::Iterator it = p2.begin(); it != p2.end(); ++it )
809 LocalDomain aDomain( p1, p2 );
812 LocalTopology aTopology( adj, omega );
813 LocalObject X( aTopology, aDomain );
814 X.pointSet().insertNew( tmp_local_points.begin(), tmp_local_points.end() );
817 typename LocalObject::SmallObject neighAdj = X.properNeighborhood( p );
820 ( X, neighAdj.pointSet().begin(),
821 neighAdj.pointSet().end() );
822 while ( ! visitor.finished() )
824 SmallObject geodesicN( this->topology(), aDomain );
825 geodesicN.
pointSet().insertNew( visitor.markedVertices().begin(),
826 visitor.markedVertices().end() );
845 template <
typename TDigitalTopology,
typename TDigitalSet>
846 template <
typename TAdjacency>
851 (
const TAdjacency & adj,
const Point & p,
unsigned int k )
const
854 typedef std::vector<Vertex> Container;
858 typedef typename Container::const_iterator ContainerConstIterator;
859 typedef typename DigitalSet::ConstIterator DigitalSetConstIterator;
864 AlphaAdjacency alpha;
865 OmegaAdjacency omega;
867 Container tmp_local_points;
868 std::back_insert_iterator< Container > back_ins_it( tmp_local_points );
870 alpha.writeNeighbors( back_ins_it, p, not_pred_is_in_X );
874 for (
typename Point::Iterator it = p1.begin(); it != p1.end(); ++it )
877 for (
typename Point::Iterator it = p2.begin(); it != p2.end(); ++it )
879 LocalDomain aDomain( p1, p2 );
882 LocalTopology aTopology( adj, omega );
883 LocalObject Xcomp( aTopology, aDomain );
884 Xcomp.pointSet().insertNew( tmp_local_points.begin(), tmp_local_points.end() );
887 typename LocalObject::SmallObject neighAdj = Xcomp.properNeighborhood( p );
890 ( Xcomp, neighAdj.pointSet().begin(),
891 neighAdj.pointSet().end() );
892 while ( ! visitor.finished() )
896 geodesicN.
pointSet().insertNew( visitor.markedVertices().begin(),
897 visitor.markedVertices().end() );
923 template <
typename TDigitalTopology,
typename TDigitalSet>
930 = geodesicNeighborhood( topology().kappa(),
931 v, Space::dimension );
937 = geodesicNeighborhoodInComplement( topology().lambda(),
938 v, Space::dimension );
941 && ( ! Glambda_compX.
pointSet().empty() );
954 template <
typename TDigitalTopology,
typename TDigitalSet>
961 <<
" topology=" << myTopo
962 <<
" counts=" << myPointSet.count()
963 <<
" set=" << *myPointSet
964 <<
" cxn=" << myConnectedness
972 template <
typename TDigitalTopology,
typename TDigitalSet>
977 return ( *myPointSet != 0 ) && (*myTopo != 0 );
989 template <
typename TDigitalTopology,
typename TDigitalSet>
1002 template <
typename TDigitalTopology,
typename TDigitalSet>
1008 object.selfDisplay( out );