44 #include "DGtal/base/Common.h"
45 #include "DGtal/kernel/SpaceND.h"
46 #include "DGtal/kernel/domains/HyperRectDomain.h"
47 #include "DGtal/kernel/sets/CDigitalSet.h"
48 #include "DGtal/kernel/sets/CDigitalSetArchetype.h"
49 #include "DGtal/kernel/domains/CDomain.h"
50 #include "DGtal/kernel/domains/CDomainArchetype.h"
51 #include "DGtal/kernel/sets/DigitalSetBySTLVector.h"
52 #include "DGtal/kernel/sets/DigitalSetBySTLSet.h"
53 #include "DGtal/kernel/sets/DigitalSetFromMap.h"
54 #include "DGtal/kernel/sets/DigitalSetSelector.h"
55 #include "DGtal/kernel/sets/DigitalSetDomain.h"
56 #include "DGtal/kernel/sets/DigitalSetInserter.h"
58 #include "DGtal/images/ImageContainerBySTLMap.h"
60 #include "DGtal/helpers/StdDefs.h"
62 #include "DGtal/io/boards/Board2D.h"
65 using namespace DGtal;
69 #define INBLOCK_TEST(x) \
70 nbok += ( x ) ? 1 : 0; \
72 trace.info() << "(" << nbok << "/" << nb << ") " \
75 #define INBLOCK_TEST2(x,y) \
76 nbok += ( x ) ? 1 : 0; \
78 trace.info() << "(" << nbok << "/" << nb << ") " \
85 virtual void setStyle(
Board2D & aboard)
const
93 bool testDigitalSetBoardSnippet()
97 typedef Z2::Point
Point;
100 Domain domain( p1, p2 );
105 SpecificSet mySet( domain );
117 board.
saveSVG(
"myset-export.svg");
122 board <<
SetMode( domain.className(),
"Grid" ) << domain << mySet;
123 board.
saveSVG(
"simpleSet-grid.svg");
128 board <<
SetMode( domain.className(),
"Paving" ) << domain;
130 board.
saveSVG(
"simpleSet-paving.svg");
138 board.
saveSVG(
"simpleSet-color.svg");
143 template <
typename DigitalSetType >
144 bool testDigitalSet(
const DigitalSetType& aSet1,
const DigitalSetType& aSet2 )
148 typedef typename DigitalSetType::Domain Domain;
149 typedef typename Domain::Point Point;
150 typedef typename Point::Coordinate Coordinate;
151 unsigned int nbok = 0;
155 DigitalSetType set1( aSet1 );
156 nbok += ( (set1.size() == 0)&&(set1.empty()) ) ? 1 : 0;
158 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") "
159 <<
"Empty set: " << set1 << std::endl;
163 Coordinate t [] = { 4, 3, 3 , 4};
164 Coordinate t2[] = { 2, 5, 3 , 5};
165 Coordinate t3[] = { 2, 5, 3 , 4} ;
177 nbok += set1.size() == 3 ? 1 : 0;
179 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") "
180 <<
"Insertion (3 elements): " << set1 << std::endl;
184 for (
typename DigitalSetType::Iterator it = set1.begin();
185 it != set1.end(); ++it)
187 if (v.find( *it ) == v.end())
190 nbok += (flag) ? 1 : 0;
192 trace.
info() <<
"Iterate: (" << nbok <<
"/" << nb <<
") "
197 nbok += ( (set1.size() == 2)
198 &&(set1.find( b ) == set1.end()) )? 1 : 0;
200 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") "
201 <<
"Erase one element by key (2 remain): " << set1 << std::endl;
203 typename DigitalSetType::Iterator it = set1.find( c );
205 nbok += ( (set1.size() == 1)
206 &&(set1.find( c ) == set1.end()) )? 1 : 0;
208 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") "
209 <<
"Erase one element by iterator (1 remain): " << set1 << std::endl;
212 DigitalSetType set2( aSet2 );
214 set1.computeComplement(inserter);
215 nbok += (set2.size() == (set2.domain().size()-1))? 1 : 0;
217 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") "
218 <<
"Complement: " << set2 << std::endl;
221 nbok += (set2.size() == (set2.domain().size()))? 1 : 0;
223 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") "
224 <<
"Union: " << set2 << std::endl;
228 nbok += ( (set1.size() == 0)&&(set1.empty()) ) ? 1 : 0;
230 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") "
231 <<
"Cleared set: " << set1 << std::endl;
233 set1.assignFromComplement(set2);
234 nbok += ( (set1.size() == 0)&&(set1.empty()) ) ? 1 : 0;
236 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") "
242 template <
typename DigitalDomain,
int props >
243 bool testDigitalSetSelector(
const DigitalDomain & domain,
244 const std::string & comment )
246 unsigned int nbok = 0;
252 < DigitalDomain, props >::Type SpecificSet;
253 SpecificSet set1( domain );
254 set1.insert( domain.lowerBound() );
255 set1.insert( domain.upperBound() );
256 nbok += set1.size() == 2 ? 1 : 0;
258 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") "
259 << comment <<
" (2 elements): " << set1 << std::endl;
267 bool testDigitalSetDraw()
269 unsigned int nbok = 0;
274 typedef Z2::Point Point;
275 Point p1( -10, -10 );
277 Domain domain( p1, p2 );
282 SpecificSet disk( domain );
286 for ( Domain::ConstIterator it = domain.begin();
290 if ( (*it - c ).norm() < 5.0 )
292 disk.insertNew( *it );
298 board <<
SetMode( domain.className(),
"Grid" ) << domain;
302 board.
saveSVG(
"disk-set.svg" );
308 bool testDigitalSetDomain()
310 unsigned int nbok = 0;
315 typedef Z2::Point Point;
316 Point p1( -49, -49 );
318 Domain domain( p1, p2 );
323 SpecificSet disk( domain );
328 for ( Domain::ConstIterator it = domain.begin();
332 if ( (*it - c ).norm() < 50.0 )
334 disk.insertNew( *it );
337 INBLOCK_TEST( disk.size() == 7824 );
338 trace.
info() <<
"disk.size()=" << disk.size() << std::endl;
344 RestrictedDomain disk_domain( disk );
346 unsigned int nb_in_domain = 0;
347 for ( RestrictedDomain::ConstIterator it = disk_domain.begin();
348 it != disk_domain.end();
353 INBLOCK_TEST( nb_in_domain == 7824 );
354 INBLOCK_TEST( disk_domain.lowerBound() == Point( -49, -49 ) );
355 INBLOCK_TEST( disk_domain.upperBound() == Point( 49, 49 ) );
361 bool testDigitalSetConcept()
364 typedef std::vector<Value>::iterator vector_iterator;
365 typedef std::set<Value>::iterator set_iterator;
383 typedef Space4Type::Point Point;
392 Domain domain ( a, b );
394 trace.
info() <<
"Domain size= " << domain.size() << std::endl;
398 bool okVector = testDigitalSet< DigitalSetBySTLVector<Domain> >
403 bool okSet = testDigitalSet< DigitalSetBySTLSet<Domain> >
409 Map map(domain); Map map2(domain);
412 bool okMap = testDigitalSet< DigitalSetFromMap<Map> >( setFromMap, setFromMap2 );
415 bool okSelectorSmall = testDigitalSetSelector
417 ( domain,
"Small set" );
419 bool okSelectorBig = testDigitalSetSelector
421 ( domain,
"Big set" );
423 bool okSelectorMediumHBel = testDigitalSetSelector
425 ( domain,
"Medium set + High belonging test" );
427 bool okDigitalSetDomain = testDigitalSetDomain();
429 bool okDigitalSetDraw = testDigitalSetDraw();
431 bool okDigitalSetDrawSnippet = testDigitalSetBoardSnippet();
433 bool res = okVector && okSet && okMap
434 && okSelectorSmall && okSelectorBig && okSelectorMediumHBel
435 && okDigitalSetDomain && okDigitalSetDraw && okDigitalSetDrawSnippet;
437 trace.
emphase() << ( res ?
"Passed." :
"Error." ) << endl;