33 #include "DGtal/base/Common.h" 
   34 #include "DGtal/base/Statistic.h" 
   35 #include "DGtal/helpers/StdDefs.h" 
   36 #include "DGtal/kernel/CPointPredicate.h" 
   37 #include "DGtal/geometry/surfaces/COBANaivePlane.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 nbpoints,
 
   63   typedef typename NaivePlane::Point 
Point;
 
   64   typedef typename Point::Component PointInteger;
 
   71   if ( ( absA >= absB ) && ( absA >= absC ) )
 
   73   else if ( ( absB >= absA ) && ( absB >= absC ) )
 
   79   plane.init( axis, diameter, 1, 1 );
 
   82   unsigned int nbok = 0;
 
   83   unsigned int nbchanges = 0;
 
   84   unsigned int complexity = plane.complexity();
 
   85   while ( nb != nbpoints )
 
   87       p[ 0 ] = getRandomInteger<PointInteger>( -diameter+1, diameter ); 
 
   88       p[ 1 ] = getRandomInteger<PointInteger>( -diameter+1, diameter ); 
 
   89       p[ 2 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
 
   98       bool ok = plane.extend( p ); 
 
   99       ++nb, nbok += ok ? 1 : 0;
 
  102           std::cerr << 
"[ERROR] p=" << p << 
" NOT IN plane=" << plane << std::endl;
 
  105       if ( plane.complexity() != complexity )
 
  107           complexity = plane.complexity();
 
  111   stats.
addValue( (
double) nbchanges );
 
  115 template <
typename NaivePlane>
 
  117 checkPlanes( 
unsigned int nbplanes, 
int diameter, 
unsigned int nbpoints,
 
  121   typedef typename NaivePlane::InternalInteger 
Integer;
 
  123   unsigned int nbok = 0;
 
  124   for ( 
unsigned int nbp = 0; nbp < nbplanes; ++nbp )
 
  126       Integer a = getRandomInteger<Integer>( (Integer) 0, (Integer) diameter / 2 ); 
 
  127       Integer b = getRandomInteger<Integer>( (Integer) 0, (Integer) diameter / 2 ); 
 
  128       Integer c = getRandomInteger<Integer>( (Integer) 0, (Integer) diameter / 2 ); 
 
  129       Integer d = getRandomInteger<Integer>( (Integer) 0, (Integer) diameter / 2 ); 
 
  130       if ( ( a != 0 ) || ( b != 0 ) || ( c != 0 ) )
 
  132           ++nb, nbok += checkPlane<Integer, NaivePlane>( a, b, c, d, diameter, nbpoints, stats ) ? 1 : 0;
 
  135               std::cerr << 
"[ERROR] for plane " << a << 
" * x + "  
  136                         << b << 
" * y + " << c << 
" * z = " << d << std::endl;
 
  148 int main( 
int argc, 
char** argv )
 
  152   unsigned int nbtries = ( argc > 1 ) ? atoi( argv[ 1 ] ) : 100;
 
  153   unsigned int nbpoints = ( argc > 2 ) ? atoi( argv[ 2 ] ) : 100;
 
  154   unsigned int diameter = ( argc > 3 ) ? atoi( argv[ 3 ] ) : 100;
 
  155   std::cout << 
"# Usage: " << argv[0] << 
" <nbtries> <nbpoints> <diameter>." << std::endl;
 
  156   std::cout << 
"# Test class COBANaivePlane. Points are randomly chosen in [-diameter,diameter]^3." << std::endl;
 
  157   std::cout << 
"# Integer nbtries nbpoints diameter time/plane(ms) E(comp) V(comp)" << std::endl;
 
  162     && checkPlanes<COBANaivePlane<Z3, DGtal::BigInteger> >( nbtries, diameter, nbpoints, stats );
 
  163   trace.
emphase() << ( res ? 
"Passed." : 
"Error." ) << endl;
 
  166   std::cout << 
"BigInteger" << 
" " << stats.
samples()
 
  169             << 
" " << ( (double) t / (
double) stats.samples() )
 
  170             << " " << stats.mean()
 
  171             << " " << stats.variance()