33 #include "DGtal/base/Common.h" 
   34 #include "DGtal/helpers/StdDefs.h" 
   35 #include "DGtal/kernel/CPointPredicate.h" 
   36 #include "DGtal/geometry/surfaces/COBANaivePlane.h" 
   37 #include "DGtal/geometry/surfaces/COBAGenericNaivePlane.h" 
   41 using namespace DGtal;
 
   47 template <
typename Integer>
 
   48 Integer getRandomInteger( 
const Integer & first, 
const Integer & after_last )
 
   51   return ( r % (after_last - first) ) + first;
 
   57 template <
typename Integer, 
typename NaivePlane>
 
   59 checkPlane( Integer a, Integer b, Integer c, Integer d, 
 
   60             int diameter, 
unsigned int nbtries )
 
   62   typedef typename NaivePlane::Point 
Point;
 
   63   typedef typename Point::Component PointInteger;
 
   70   if ( ( absA >= absB ) && ( absA >= absC ) )
 
   72   else if ( ( absB >= absA ) && ( absB >= absC ) )
 
   78   plane.init( axis, diameter, 1, 1 );
 
   81   unsigned int nbok = 0;
 
   82   while ( nb != nbtries )
 
   84       p[ 0 ] = getRandomInteger<PointInteger>( -diameter+1, diameter ); 
 
   85       p[ 1 ] = getRandomInteger<PointInteger>( -diameter+1, diameter ); 
 
   86       p[ 2 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
 
   95       bool ok_ext = plane.isExtendable( p ); 
 
   96       bool ok = plane.extend( p ); 
 
   97       ++nb, nbok += ok_ext ? 1 : 0;
 
   98       ++nb, nbok += ok ? 1 : 0;
 
  101           std::cerr << 
"[ERROR] p=" << p << 
" NOT IN plane=" << plane << std::endl;
 
  106           std::cerr << 
"[ERROR] p=" << p << 
" was NOT extendable IN plane=" << plane << std::endl;
 
  114   while ( nb != (nbtries * 11 ) / 10 )
 
  116       p[ 0 ] = getRandomInteger<PointInteger>( -diameter+1, diameter ); 
 
  117       p[ 1 ] = getRandomInteger<PointInteger>( -diameter+1, diameter ); 
 
  118       p[ 2 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
 
  127       PointInteger tmp = getRandomInteger<PointInteger>( 2, 5 ) 
 
  128         * (2*getRandomInteger<PointInteger>( 0, 2 ) - 1 );
 
  130       bool ok_ext = ! plane.isExtendable( p ); 
 
  131       bool ok = ! plane.extend( p ); 
 
  132       ++nb, nbok += ok ? 1 : 0;
 
  133       ++nb, nbok += ok_ext ? 1 : 0;
 
  136           std::cerr << 
"[ERROR] p=" << p << 
" IN plane=" << plane << std::endl;
 
  141           std::cerr << 
"[ERROR] p=" << p << 
" was extendable IN plane=" << plane << std::endl;
 
  154 template <
typename Integer, 
typename GenericNaivePlane>
 
  156 checkGenericPlane( Integer a, Integer b, Integer c, Integer d, 
 
  157                    int diameter, 
unsigned int nbtries )
 
  159   typedef typename GenericNaivePlane::Point Point;
 
  160   typedef typename Point::Component PointInteger;
 
  167   if ( ( absA >= absB ) && ( absA >= absC ) )
 
  169   else if ( ( absB >= absA ) && ( absB >= absC ) )
 
  174   GenericNaivePlane plane;
 
  175   plane.init( diameter, 1, 1 );
 
  178   unsigned int nbok = 0;
 
  179   while ( nb != nbtries )
 
  181       p[ 0 ] = getRandomInteger<PointInteger>( -diameter+1, diameter ); 
 
  182       p[ 1 ] = getRandomInteger<PointInteger>( -diameter+1, diameter ); 
 
  183       p[ 2 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
 
  192       bool ok_ext = plane.isExtendable( p ); 
 
  193       bool ok = plane.extend( p ); 
 
  194       ++nb, nbok += ok_ext ? 1 : 0;
 
  195       ++nb, nbok += ok ? 1 : 0;
 
  198           std::cerr << 
"[ERROR] p=" << p << 
" NOT IN plane=" << plane << std::endl;
 
  203           std::cerr << 
"[ERROR] p=" << p << 
" was NOT extendable IN plane=" << plane << std::endl;
 
  211   while ( nb != (nbtries * 11 ) / 10 )
 
  213       p[ 0 ] = getRandomInteger<PointInteger>( -diameter+1, diameter ); 
 
  214       p[ 1 ] = getRandomInteger<PointInteger>( -diameter+1, diameter ); 
 
  215       p[ 2 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
 
  224       PointInteger tmp = getRandomInteger<PointInteger>( 2, 5 ) 
 
  225         * (2*getRandomInteger<PointInteger>( 0, 2 ) - 1 );
 
  227       bool ok_ext = ! plane.isExtendable( p ); 
 
  228       bool ok = ! plane.extend( p ); 
 
  229       ++nb, nbok += ok ? 1 : 0;
 
  230       ++nb, nbok += ok_ext ? 1 : 0;
 
  233           std::cerr << 
"[ERROR] p=" << p << 
" IN plane=" << plane << std::endl;
 
  238           std::cerr << 
"[ERROR] p=" << p << 
" was extendable IN plane=" << plane << std::endl;
 
  244   std::cerr << 
"plane = " << plane << std::endl;
 
  249 template <
typename Integer, 
typename NaivePlane>
 
  251 checkPlanes( 
unsigned int nbplanes, 
int diameter, 
unsigned int nbtries )
 
  256   unsigned int nbok = 0;
 
  257   for ( 
unsigned int nbp = 0; nbp < nbplanes; ++nbp )
 
  259       Integer a = getRandomInteger<Integer>( (
Integer) 0, (Integer) diameter / 2 ); 
 
  260       Integer b = getRandomInteger<Integer>( (Integer) 0, (Integer) diameter / 2 ); 
 
  261       Integer c = getRandomInteger<Integer>( (Integer) 0, (Integer) diameter / 2 ); 
 
  262       Integer d = getRandomInteger<Integer>( (Integer) 0, (Integer) diameter / 2 ); 
 
  263       if ( ( a != 0 ) || ( b != 0 ) || ( c != 0 ) )
 
  265           ++nb, nbok += checkPlane<Integer, NaivePlane>( a, b, c, d, diameter, nbtries ) ? 1 : 0;
 
  268               std::cerr << 
"[ERROR] for plane " << a << 
" * x + "  
  269                         << b << 
" * y + " << c << 
" * z = " << d << std::endl;
 
  281 bool testCOBANaivePlane()
 
  283   unsigned int nbok = 0;
 
  291   BOOST_CONCEPT_ASSERT(( boost::ForwardContainer< NaivePlane > ));
 
  293   BOOST_CONCEPT_ASSERT(( boost::ForwardContainer< GenericNaivePlane > ));
 
  297   Point pt0( 0, 0, 0 );
 
  298   plane.init( 2, 100, 3, 2 );
 
  299   bool pt0_inside = plane.extend( pt0 );
 
  300   trace.
info() << 
"(" << nbok << 
"/" << nb << 
") Plane=" << plane
 
  302   Point pt1( Point( 8, 1, 3 ) );
 
  303   bool pt1_inside = plane.extend( pt1 );
 
  304   ++nb, nbok += pt1_inside == 
true ? 1 : 0;
 
  305   trace.
info() << 
"(" << nbok << 
"/" << nb << 
") add " << pt1 
 
  306                << 
" Plane=" << plane << std::endl;
 
  307   Point pt2( Point( 2, 7, 1 ) );
 
  308   bool pt2_inside = plane.extend( pt2 );
 
  309   ++nb, nbok += pt2_inside == 
true ? 1 : 0;
 
  310   trace.
info() << 
"(" << nbok << 
"/" << nb << 
") add " << pt2 
 
  311                << 
" Plane=" << plane << std::endl;
 
  313   Point pt3( Point( 0, 5, 17 ) );
 
  314   bool pt3_inside = plane.extend( pt3 );
 
  315   ++nb, nbok += pt3_inside == 
false ? 1 : 0;
 
  316   trace.
info() << 
"(" << nbok << 
"/" << nb << 
") add " << pt3
 
  317                << 
" Plane=" << plane << std::endl;
 
  319   Point pt4( Point( -10, -10, 10 ) );
 
  320   bool pt4_inside = plane.extend( pt4 );
 
  321   ++nb, nbok += pt4_inside == 
false ? 1 : 0;
 
  322   trace.
info() << 
"(" << nbok << 
"/" << nb << 
") add " << pt4
 
  323                << 
" Plane=" << plane << std::endl;
 
  325   Point pt5 = pt0 + pt1 + pt2 + Point( 0, 0, 2 );
 
  326   bool pt5_inside = plane.extend( pt5 );
 
  327   ++nb, nbok += pt5_inside == 
true ? 1 : 0;
 
  328   trace.
info() << 
"(" << nbok << 
"/" << nb << 
") add " << pt5
 
  329                << 
" Plane=" << plane << std::endl;
 
  332   plane2.init( 2, 100, 1, 1 );
 
  333   plane2.extend( Point( 10, 0, 0 ) );
 
  334   plane2.extend( Point( 0, 8, 0 ) );
 
  335   plane2.extend( Point( 0, 0, 6 ) );
 
  336   trace.
info() << 
"(" << nbok << 
"/" << nb << 
") " 
  337                << 
" Plane2=" << plane2 << std::endl;
 
  339   ++nb, nbok += checkPlane<Integer,NaivePlane>( 11, 5, 19, 20, 100, 100 ) ? 1 : 0;
 
  341                << 
") checkPlane<Integer,NaivePlane>( 11, 5, 19, 20, 100, 100 )" 
  344   ++nb, nbok += checkGenericPlane<Integer,GenericNaivePlane>( 11, 5, 19, 20, 100, 100 ) ? 1 : 0;
 
  346                << 
") checkGenericPlane<Integer,GenericNaivePlane>( 11, 5, 19, 20, 100, 100 )" 
  348   ++nb, nbok += checkGenericPlane<Integer,GenericNaivePlane>( 17, 33, 7, 10, 100, 100 ) ? 1 : 0;
 
  350                << 
") checkGenericPlane<Integer,GenericNaivePlane>( 17, 33, 7, 10, 100, 100 )" 
  352   ++nb, nbok += checkPlane<Integer,NaivePlane>( 15, 8, 13, 15, 100, 100 ) ? 1 : 0;
 
  354                << 
") checkPlane<Integer,NaivePlane>( 15, 8, 13, 15, 100, 100 )" 
  356   ++nb, nbok += checkGenericPlane<Integer,GenericNaivePlane>( 15, 8, 13, 15, 100, 100 ) ? 1 : 0;
 
  358                << 
") checkGenericPlane<Integer,GenericNaivePlane>( 15, 8, 13, 15, 100, 100 )" 
  364 template <
typename NaivePlane>
 
  366 checkManyPlanes( 
unsigned int diameter,
 
  367                  unsigned int nbplanes, 
 
  368                  unsigned int nbpoints )
 
  370   unsigned int nbok = 0;
 
  372   typedef typename NaivePlane::InternalInteger 
Integer;
 
  373   stringstream ss (stringstream::out);
 
  374   ss << 
"Testing block: Diameter is " << diameter << 
". Check " << nbplanes << 
" planes with " << nbpoints << 
" points each.";
 
  376   ++nb, nbok += checkPlanes<Integer,NaivePlane>( nbplanes, diameter, nbpoints ) ? 1 : 0;
 
  378                << 
") checkPlanes<Integer,NaivePlane>()" 
  387 template <
typename NaivePlane>
 
  388 unsigned int maxDiameter( 
unsigned int min, 
unsigned int max )
 
  392       unsigned int middle = (min+max)/2;
 
  393       bool ok =  checkManyPlanes<NaivePlane>( middle, 2, 2000 );
 
  394       if ( ok ) min = middle+1;
 
  402 int main( 
int , 
char**  )
 
  408     && testCOBANaivePlane()
 
  409     && checkManyPlanes<COBANaivePlane<Z3, DGtal::int32_t> >( 20, 100, 200 )
 
  411     && checkManyPlanes<COBANaivePlane<Z3, DGtal::BigInteger> >( 10000, 10, 200 );
 
  412   trace.
emphase() << ( res ? 
"Passed." : 
"Error." ) << endl;