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;