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/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 checkGenericPlane( 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( 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 checkGenericPlanes(
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 += checkGenericPlane<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 COBAGenericNaivePlane. 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 && checkGenericPlanes<COBAGenericNaivePlane<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()