31 #if defined(NeighborhoodConfigurationsGenerators_RECURSES)
32 #error Recursive header files inclusion detected in NeighborhoodConfigurationsGenerators.h
33 #else // defined(NeighborhoodConfigurationsGenerators_RECURSES)
35 #define NeighborhoodConfigurationsGenerators_RECURSES
37 #if !defined NeighborhoodConfigurationsGenerators_h
39 #define NeighborhoodConfigurationsGenerators_h
45 #include "DGtal/topology/Object.h"
46 #include "DGtal/helpers/StdDefs.h"
47 #include <unordered_map>
48 #include "boost/dynamic_bitset.hpp"
49 #include <DGtal/topology/helpers/NeighborhoodConfigurationsHelper.h>
50 #include "DGtal/topology/VoxelComplexFunctions.h"
69 template <
typename TObject,
typename TMap>
72 const typename TObject::DigitalTopology & dt,
80 Point p1 = Point::diagonal( -1 );
81 Point p2 = Point::diagonal( 1 );
82 Point c = Point::diagonal( 0 );
85 TObject shape( dt, shapeSet );
87 for ( DomainConstIterator it =
domain.begin(); it !=
domain.end(); ++it )
90 &&
"[generateSimplicityTable] number of configurations is too high." );
91 unsigned int nbCfg = 1 << k;
94 if ( ( cfg % 1000 ) == 0 )
98 shape.pointSet().clear();
99 shape.pointSet().insert( c );
101 for ( DomainConstIterator it =
domain.begin(); it !=
domain.end(); ++it )
105 if ( cfg & mask ) shape.pointSet().insert( *it );
109 bool simple = shape.isSimple( c );
130 template <
typename TVoxelComplex,
typename TMap>
135 const TVoxelComplex & ,
143 Domain, std::unordered_set< Point > >;
147 Point p1 = Point::diagonal( -1 );
148 Point p2 = Point::diagonal( 1 );
149 Point c = Point::diagonal( 0 );
153 for ( DomainConstIterator it =
domain.begin(); it !=
domain.end(); ++it )
156 &&
"[generateVoxelComplexTable] number of configurations is too high." );
157 unsigned int nbCfg = 1 << k;
161 ks.
init(
domain.lowerBound() + Point::diagonal( -1 ) ,
162 domain.upperBound() + Point::diagonal( 1 ),
164 TVoxelComplex vc(ks);
165 vc.construct(shapeSet);
166 for (
unsigned int cfg = 0; cfg < nbCfg; ++cfg ){
167 if ( ( cfg % 1000 ) == 0 )
170 vc.insertVoxelPoint(c);
171 unsigned int mask = 1;
172 for ( DomainConstIterator it =
domain.begin(); it !=
domain.end(); ++it ){
174 if ( cfg & mask ) vc.insertVoxelPoint( *it );
178 const auto &kcell = vc.space().uSpel(c);
179 bool predicate_output = skelFunction(vc, kcell);
180 map[ cfg ] = predicate_output;
187 #endif // !defined NeighborhoodConfigurationsGenerators_h
189 #undef NeighborhoodConfigurationsGenerators_RECURSES
190 #endif // else defined(NeighborhoodConfigurationsGenerators_RECURSES)