31#if defined(NeighborhoodConfigurationsGenerators_RECURSES)
32#error Recursive header files inclusion detected in NeighborhoodConfigurationsGenerators.h
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,
75 typedef typename TObject::DigitalSet
DigitalSet;
76 typedef typename TObject::Point
Point;
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 & ,
136 const typename TVoxelComplex::Cell & )
143 Domain, std::unordered_set< Point > >;
145 using KSpace =
typename TVoxelComplex::KSpace;
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;
189#undef NeighborhoodConfigurationsGenerators_RECURSES
Aim: A wrapper class around a STL associative container for storing sets of digital points within som...
TDomain Domain
Domain type.
Iterator for HyperRectDomain.
Aim: This class is a model of CCellularGridSpaceND. It represents the cubical grid as a cell complex,...
bool init(const Point &lower, const Point &upper, bool isClosed)
Specifies the upper and lower bounds for the maximal cells in this space.
void progressBar(const double currentValue, const double maximalValue)
HyperRectDomain< Space > Domain
void generateVoxelComplexTable(TMap &map, std::function< bool(const TVoxelComplex &, const typename TVoxelComplex::Cell &) > skelFunction)
void generateSimplicityTable(const typename TObject::DigitalTopology &dt, TMap &map)
DGtal is the top-level namespace which contains all DGtal functions and types.
uint32_t NeighborhoodConfiguration
HyperRectDomain< Space > Domain
Z2i::DigitalSet DigitalSet