32 #include "DGtal/base/Common.h"
33 #include "DGtal/helpers/StdDefs.h"
34 #include "DGtal/geometry/volumes/distance/VoronoiMap.h"
35 #include "DGtal/geometry/volumes/distance/DistanceTransformation.h"
36 #include "DGtal/kernel/BasicPointPredicates.h"
37 #include "DGtal/io/boards/Board2D.h"
38 #include "DGtal/io/colormaps/HueShadeColorMap.h"
42 using namespace DGtal;
48 template<
typename Po
int>
49 double mynorm(
const Point &point,
const double p)
52 for(
unsigned int i=0; i< Point::dimension; i++)
53 res += std::pow ( (
double)
abs(point[i]) , p);
56 return exp( 1.0/p*log(res));
59 template <
typename VoroMap>
60 void saveVoroMap(
const std::string &filename,
const VoroMap &output,
const double p)
65 for (
typename VoroMap::Domain::ConstIterator it = output.domain().begin(), itend = output.domain().end();
68 typename VoroMap::Value point = output(*it);
69 if ( mynorm(point-(*it),p) > maxdt)
70 maxdt = mynorm(point-(*it),p);
77 for(
typename VoroMap::Domain::ConstIterator it = output.domain().begin(),
78 itend = output.domain().end();
81 typename VoroMap::Value point = output(*it);
84 hue(mynorm(point- (*it),p))))
88 board.
saveSVG(filename.c_str());
94 template <
typename Set,
typename Image>
95 bool checkVoronoiL2(
const Set &aSet,
const Image & voro)
102 Point psite = voro(*it);
106 d+= (p[i]-psite[i])*(p[i]-psite[i]);
108 for(
typename Set::ConstIterator itset = aSet.begin(), itendSet = aSet.end();
114 dbis+= (p[i]-(*itset)[i])*(p[i]-(*itset)[i]);
117 trace.
error() <<
"DT Error at "<<p<<
" Voro:"<<psite<<
" ("<<d<<
") from set:"
118 << (*itset) <<
"("<<dbis<<
")"<<std::endl;
130 bool testVoronoiMap()
132 unsigned int nbok = 0;
146 mySet.insertNew( *it );
162 Predicate myPredicate(mySet);
169 Voro2 voro(domain, myPredicate);
171 Voro2::OutputImage output = voro.compute();
173 for(
int j=-10; j <= 10; j++)
175 for(
int i=-10; i<=10; i++)
182 for(Voro2::OutputImage::Domain::ConstIterator it = output.domain().begin(), itend = output.domain().end();
186 unsigned char c = (p[1]*13 + p[0] * 7) % 256;
193 nbok += checkVoronoiL2(sites,output) ? 1 : 0;
195 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") "
196 <<
"Voronoi diagram is valid !" << std::endl;
211 template<
typename Set>
212 bool testVoronoiMapFromSites2D(
const Set &aSet,
const std::string &name)
214 unsigned int nbok = 0;
217 Set mySet(aSet.domain());
219 for(
typename Set::Domain::ConstIterator it = aSet.domain().begin(), itend = aSet.domain().end();
222 mySet.insertNew( *it );
225 for(
typename Set::ConstIterator it = aSet.begin(), itend = aSet.end();
231 Predicate myPredicate(mySet);
235 Voro2 voro(aSet.domain(), myPredicate);
236 typename Voro2::OutputImage output = voro.compute();
248 Voro6 voro6(aSet.domain(), myPredicate);
249 typename Voro6::OutputImage output6 = voro6.
compute();
256 DT dt(aSet.domain(), myPredicate);
257 typename DT::OutputImage output2 = dt.
compute();
261 if ( (aSet.domain().upperBound()[1] - aSet.domain().lowerBound()[1]) <20)
263 for(
int j= aSet.domain().lowerBound()[1]; j <= aSet.domain().upperBound()[1]; j++)
265 for(
int i=aSet.domain().lowerBound()[0]; i<=aSet.domain().upperBound()[0]; i++)
266 if ( aSet.find(
Z2i::Point(i,j) ) != aSet.end() )
275 for(
int j= aSet.domain().lowerBound()[1]; j <= aSet.domain().upperBound()[1]; j++)
277 for(
int i=aSet.domain().lowerBound()[0]; i<=aSet.domain().upperBound()[0]; i++)
284 for(
typename Voro2::OutputImage::Domain::ConstIterator it = output.domain().begin(), itend = output.domain().end();
288 unsigned char c = (p[1]*13 + p[0] * 7) % 256;
293 std::string filename=
"Voromap-"+name+
".svg";
294 board.
saveSVG(filename.c_str());
295 filename=
"Voromap-hue"+name+
".svg";
296 saveVoroMap(filename.c_str(),output,2);
300 for(
typename Voro2::OutputImage::Domain::ConstIterator it = output.domain().begin(), itend = output.domain().end();
305 Display2DFactory::draw( board, p - (*it), (*it));
308 filename=
"Voromap-diag-"+name+
".svg";
309 board.
saveSVG(filename.c_str());
312 for(
typename Voro6::OutputImage::Domain::ConstIterator it = output6.domain().begin(),
313 itend = output6.domain().end();
318 Display2DFactory::draw( board, p - (*it), (*it));
321 filename=
"Voromap-diag-l6-"+name+
".svg";
322 board.
saveSVG(filename.c_str());
325 for(
typename Voro6::OutputImage::Domain::ConstIterator it = output6.domain().begin(), itend = output6.domain().end();
329 unsigned char c = (p[1]*13 + p[0] * 7) % 256;
334 filename=
"Voromap-l6"+name+
".svg";
335 board.
saveSVG(filename.c_str());
336 filename=
"Voromap-hue-l6-"+name+
".svg";
337 saveVoroMap(filename.c_str(),output6,3);
358 nbok += checkVoronoiL2(aSet,output) ? 1 : 0;
360 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") "
361 <<
"Voronoi diagram is valid !" << std::endl;
370 template<
typename Set>
371 bool testVoronoiMapFromSites(
const Set &aSet)
373 unsigned int nbok = 0;
376 Set mySet(aSet.domain());
378 for(
typename Set::Domain::ConstIterator it = aSet.domain().begin(),
379 itend = aSet.domain().end();
382 mySet.insertNew( *it );
385 for(
typename Set::ConstIterator it = aSet.begin(), itend = aSet.end();
391 Predicate myPredicate(mySet);
398 Voro2 voro(aSet.domain(), myPredicate);
399 typename Voro2::OutputImage output = voro.compute();
405 Voro3 voro3(aSet.domain(), myPredicate);
406 typename Voro3::OutputImage output3 = voro3.
compute();
412 DT dt(aSet.domain(), myPredicate);
413 typename DT::OutputImage output2 = dt.
compute();
418 nbok += (checkVoronoiL2(aSet,output) )? 1 : 0;
421 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") "
422 <<
"Voronoi diagram is valid !" << std::endl;
443 ok = testVoronoiMapFromSites2D<Z2i::DigitalSet>(sites,
"simple");
450 bool testSimpleRandom2D()
461 for(
unsigned int i = 0 ; i < 64; ++i)
463 Z2i::Point p( rand() % (b[0]) - a[0], rand() % (b[1]) + a[1] );
466 ok = testVoronoiMapFromSites2D<Z2i::DigitalSet>(sites,
"random");
470 for(
unsigned int i = 0 ; i < 64*64-64; ++i)
472 Z2i::Point p( rand() % (b[0]) - a[0], rand() % (b[1]) + a[1] );
475 ok = testVoronoiMapFromSites2D<Z2i::DigitalSet>(sites,
"random-dense");
498 ok = testVoronoiMapFromSites<Z3i::DigitalSet>(sites);
505 bool testSimpleRandom3D()
516 for(
unsigned int i = 0 ; i < 64; ++i)
519 rand() % (b[1]) + a[1],
520 rand() % (b[2]) + a[2] );
523 ok = testVoronoiMapFromSites<Z3i::DigitalSet>(sites);
536 Space4::Point a(0,0,0,0);
537 Space4::Point b(5,5,5,5);
544 sites.insertNew( Space4::Point(1,4,1,1));
545 sites.insertNew( Space4::Point(3,1,3,1));
546 sites.insertNew( Space4::Point(0,0,0,0));
548 ok = testVoronoiMapFromSites< DigitalSetBySTLSet< HyperRectDomain<Space4> > >(sites);
559 int main(
int argc,
char** argv )
563 for (
int i = 0; i < argc; ++i )
567 bool res = testVoronoiMap()
569 && testSimpleRandom2D()
571 && testSimpleRandom3D()
573 trace.
emphase() << ( res ?
"Passed." :
"Error." ) << endl;