DGtal 2.1.0
Loading...
Searching...
No Matches
testChordNaivePlaneComputer.cpp File Reference
#include <cstdlib>
#include <iostream>
#include "DGtal/base/Common.h"
#include "DGtal/helpers/StdDefs.h"
#include "DGtal/kernel/CPointPredicate.h"
#include "DGtal/geometry/surfaces/CAdditivePrimitiveComputer.h"
#include "DGtal/geometry/surfaces/ChordNaivePlaneComputer.h"
#include "DGtal/geometry/surfaces/ChordGenericNaivePlaneComputer.h"
Include dependency graph for testChordNaivePlaneComputer.cpp:

Go to the source code of this file.

Functions

template<typename Integer >
Integer getRandomInteger (Integer first, Integer after_last)
 
template<typename Integer , typename NaivePlaneComputer >
bool checkPlane (Integer a, Integer b, Integer c, Integer d, int diameter, unsigned int nbtries)
 
template<typename Integer , typename NaivePlaneComputer >
bool checkPlaneGroupExtension (Integer a, Integer b, Integer c, Integer d, int diameter, unsigned int nbtries)
 
template<typename Integer , typename GenericNaivePlaneComputer >
bool checkGenericPlane (Integer a, Integer b, Integer c, Integer d, int diameter, unsigned int nbtries)
 
template<typename Integer , typename NaivePlaneComputer >
bool checkPlanes (unsigned int nbplanes, int diameter, unsigned int nbtries)
 
template<typename Integer , typename NaivePlaneComputer >
bool checkWidth (Integer a, Integer b, Integer c, Integer d, int diameter, unsigned int nbtries)
 
template<typename Integer , typename NaivePlaneComputer >
bool checkWidths (unsigned int nbplanes, int diameter, unsigned int nbtries)
 
bool testChordNaivePlaneComputer ()
 
template<typename NaivePlaneComputer >
bool checkManyPlanes (unsigned int diameter, unsigned int nbplanes, unsigned int nbpoints)
 
template<typename GenericNaivePlaneComputer >
bool checkExtendWithManyPoints (unsigned int diameter, unsigned int nbplanes, unsigned int nbpoints)
 
int main (int, char **)
 

Detailed Description

This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.

Author
Jacques-Olivier Lachaud (jacqu.nosp@m.es-o.nosp@m.livie.nosp@m.r.la.nosp@m.chaud.nosp@m.@uni.nosp@m.v-sav.nosp@m.oie..nosp@m.fr ) Laboratory of Mathematics (CNRS, UMR 5127), University of Savoie, France
Date
2012/03/05

Functions for testing class ChordNaivePlaneComputer.

This file is part of the DGtal library.

Definition in file testChordNaivePlaneComputer.cpp.

Function Documentation

◆ checkExtendWithManyPoints()

template<typename GenericNaivePlaneComputer >
bool checkExtendWithManyPoints ( unsigned int  diameter,
unsigned int  nbplanes,
unsigned int  nbpoints 
)

Definition at line 696 of file testChordNaivePlaneComputer.cpp.

699{
700 unsigned int nbok = 0;
701 unsigned int nb = 0;
702 typedef typename GenericNaivePlaneComputer::InternalScalar Integer;
703 typedef typename GenericNaivePlaneComputer::Point Point;
704 typedef typename Point::Coordinate PointInteger;
706
707 trace.beginBlock( "checkExtendWithManyPoints" );
708 for ( unsigned int j = 0; j < nbplanes; ++j )
709 {
710 Integer a = getRandomInteger<Integer>( (Integer) 0, (Integer) diameter / 2 );
711 Integer b = getRandomInteger<Integer>( (Integer) 0, (Integer) diameter / 2 );
712 Integer c = getRandomInteger<Integer>( (Integer) 1, (Integer) diameter / 2 );
713 Integer d = getRandomInteger<Integer>( (Integer) 0, (Integer) diameter / 2 );
714 GenericNaivePlaneComputer plane;
715 Dimension axis;
716 if ( ( a >= b ) && ( a >= c ) ) axis = 0;
717 else if ( ( b >= a ) && ( b >= c ) ) axis = 1;
718 else axis = 2;
719 plane.init( 1, 1 );
720
721 std::vector<Point> pts;
722 for ( unsigned int i = 0; i < nbpoints; ++i )
723 {
724 Point p;
725 p[ 0 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
726 p[ 1 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
727 p[ 2 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
728 Integer x = (Integer) p[ 0 ];
729 Integer y = (Integer) p[ 1 ];
730 Integer z = (Integer) p[ 2 ];
731 switch( axis ) {
732 case 0: p[ 0 ] = (Integer)NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - b * y - c * z, a ) ); break;
733 case 1: p[ 1 ] = (Integer)NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - a * x - c * z, b ) ); break;
734 case 2: p[ 2 ] = (Integer)NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - a * x - b * y, c ) ); break;
735 }
736 pts.push_back( p );
737 }
738 ++nb; nbok += plane.isExtendable( pts.begin(), pts.end() ); // should be ok
739 trace.info() << "(" << nbok << "/" << nb
740 << ") plane.isExtendable( pts.begin(), pts.end() )"
741 << std::endl;
742 Point & any0 = pts[ getRandomInteger<int>( 0, pts.size() ) ];
743 pts.push_back( any0 + Point(1,0,0) );
744 Point & any1 = pts[ getRandomInteger<int>( 0, pts.size() ) ];
745 pts.push_back( any1 + Point(0,1,0) );
746 Point & any2 = pts[ getRandomInteger<int>( 0, pts.size() ) ];
747 pts.push_back( any2 + Point(0,0,1) );
748 bool check = ! plane.isExtendable( pts.begin(), pts.end() ); // should not be ok
749 ++nb; nbok += check ? 1 : 0;
750 trace.info() << "(" << nbok << "/" << nb
751 << ") ! plane.isExtendable( pts.begin(), pts.end() )"
752 << std::endl;
753 if ( ! check )
754 trace.warning() << plane << " last=" << pts.back() << std::endl
755 << "a=" << a << " b=" << b << " c=" << c << " d=" << d << std::endl;
756 ++nb; nbok += plane.extend( pts.begin(), pts.end() - 3 ); // should be ok
757 trace.info() << "(" << nbok << "/" << nb
758 << ") plane.extend( pts.begin(), pts.end() - 3)"
759 << std::endl;
760 ++nb; nbok += ! plane.extend( pts.end() - 3, pts.end() ); // should not be ok
761 trace.info() << "(" << nbok << "/" << nb
762 << ") ! plane.extend( pts.end() - 3, pts.end() )"
763 << std::endl;
764 }
765 trace.endBlock();
766 return nb == nbok;
767}
Aim: This class gathers several types and methods to make computation with integers.
Integer ceilDiv(IntegerParamType na, IntegerParamType nb) const
void beginBlock(const std::string &keyword="")
std::ostream & warning()
std::ostream & info()
double endBlock()
DGtal::uint32_t Dimension
Definition Common.h:119
Trace trace
Aim: The traits class for all models of Cinteger.
MyPointD Point

References DGtal::Trace::beginBlock(), DGtal::IntegerComputer< TInteger >::ceilDiv(), DGtal::Trace::endBlock(), DGtal::Trace::info(), DGtal::trace, and DGtal::Trace::warning().

◆ checkGenericPlane()

template<typename Integer , typename GenericNaivePlaneComputer >
bool checkGenericPlane ( Integer  a,
Integer  b,
Integer  c,
Integer  d,
int  diameter,
unsigned int  nbtries 
)

Checks the naive plane d <= ax+by+cz <= d + max(|a|,|b|,|c|)-1

Definition at line 283 of file testChordNaivePlaneComputer.cpp.

285{
286 typedef typename GenericNaivePlaneComputer::Point Point;
287 typedef typename Point::Component PointInteger;
289 Integer absA = ic.abs( a );
290 Integer absB = ic.abs( b );
291 Integer absC = ic.abs( c );
292 Integer x, y, z;
293 Dimension axis;
294 if ( ( absA >= absB ) && ( absA >= absC ) )
295 axis = 0;
296 else if ( ( absB >= absA ) && ( absB >= absC ) )
297 axis = 1;
298 else
299 axis = 2;
300 Point p;
301 GenericNaivePlaneComputer plane;
302 plane.init( 1, 1 );
303 // Checks that points within the naive plane are correctly recognized.
304 unsigned int nb = 0;
305 unsigned int nbok = 0;
306 while ( nb != nbtries )
307 {
308 p[ 0 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
309 p[ 1 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
310 p[ 2 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
311 x = (Integer) p[ 0 ];
312 y = (Integer) p[ 1 ];
313 z = (Integer) p[ 2 ];
314 switch ( axis ) {
315 case 0: p[ 0 ] = (PointInteger)NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - b * y - c * z, a ) ); break;
316 case 1: p[ 1 ] = (PointInteger)NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - a * x - c * z, b ) ); break;
317 case 2: p[ 2 ] = (PointInteger)NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - a * x - b * y, c ) ); break;
318 }
319 bool ok_ext = plane.isExtendable( p ); // should be ok
320 bool ok = plane.extend( p ); // should be ok
321 ++nb; nbok += ok_ext ? 1 : 0;
322 ++nb; nbok += ok ? 1 : 0;
323 if ( ! ok )
324 {
325 std::cerr << "[ERROR] p=" << p << " NOT IN plane=" << plane << std::endl;
326 for ( typename GenericNaivePlaneComputer::ConstIterator it = plane.begin(), itE = plane.end();
327 it != itE; ++it )
328 std::cerr << " " << *it;
329 std::cerr << endl;
330 std::cerr << "d <= a*x+b*y+c*z <= d+max(a,b,c)"
331 << d << " <= " << a << "*" << p[0]
332 << "+" << b << "*" << p[1]
333 << "+" << c << "*" << p[2]
334 << " = " << (a*p[0]+b*p[1]+c*p[2])
335 << std::endl;
336 break;
337 }
338 if ( ! ok_ext )
339 {
340 std::cerr << "[ERROR] p=" << p << " was NOT extendable IN plane=" << plane << std::endl;
341 break;
342 }
343 // else
344 // std::cerr << "[OK] p=" << p << " IN plane=" << plane << std::endl;
345 }
346
347 // Checks that points outside the naive plane are correctly recognized as outliers.
348 while ( nb != (nbtries * 11 ) / 10 )
349 {
350 p[ 0 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
351 p[ 1 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
352 p[ 2 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
353 x = (Integer) p[ 0 ];
354 y = (Integer) p[ 1 ];
355 z = (Integer) p[ 2 ];
356 switch ( axis ) {
357 case 0: p[ 0 ] = (PointInteger)NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - b * y - c * z, a ) ); break;
358 case 1: p[ 1 ] = (PointInteger)NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - a * x - c * z, b ) ); break;
359 case 2: p[ 2 ] = (PointInteger)NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - a * x - b * y, c ) ); break;
360 }
361 PointInteger tmp = getRandomInteger<PointInteger>( 2, 5 )
362 * (2*getRandomInteger<PointInteger>( 0, 2 ) - 1 );
363 p[ axis ] += tmp;
364 bool ok_ext = ! plane.isExtendable( p ); // should *not* be ok
365 bool ok = ! plane.extend( p ); // should *not* be ok
366 ++nb; nbok += ok ? 1 : 0;
367 ++nb; nbok += ok_ext ? 1 : 0;
368 if ( ! ok )
369 {
370 std::cerr << "[ERROR] p=" << p << " IN plane=" << plane << std::endl;
371 break;
372 }
373 if ( ! ok_ext )
374 {
375 std::cerr << "[ERROR] p=" << p << " was extendable IN plane=" << plane << std::endl;
376 break;
377 }
378 // else
379 // std::cerr << "[OK] p=" << p << " IN plane=" << plane << std::endl;
380 }
381 std::cerr << "plane = " << plane << std::endl;
382 return nb == nbok;
383}
static Integer abs(IntegerParamType a)

References DGtal::IntegerComputer< TInteger >::abs(), and DGtal::IntegerComputer< TInteger >::ceilDiv().

◆ checkManyPlanes()

template<typename NaivePlaneComputer >
bool checkManyPlanes ( unsigned int  diameter,
unsigned int  nbplanes,
unsigned int  nbpoints 
)

Definition at line 676 of file testChordNaivePlaneComputer.cpp.

679{
680 unsigned int nbok = 0;
681 unsigned int nb = 0;
682 typedef typename NaivePlaneComputer::InternalScalar Scalar;
683 stringstream ss (stringstream::out);
684 ss << "Testing block: Diameter is " << diameter << ". Check " << nbplanes << " planes with " << nbpoints << " points each.";
685 trace.beginBlock ( ss.str() );
686 ++nb; nbok += checkPlanes<Scalar,NaivePlaneComputer>( nbplanes, diameter, nbpoints ) ? 1 : 0;
687 trace.info() << "(" << nbok << "/" << nb
688 << ") checkPlanes<Scalar,NaivePlaneComputer>()"
689 << std::endl;
690 trace.endBlock();
691 return nbok == nb;
692}

References DGtal::Trace::beginBlock(), DGtal::Trace::endBlock(), DGtal::Trace::info(), and DGtal::trace.

Referenced by main().

◆ checkPlane()

template<typename Integer , typename NaivePlaneComputer >
bool checkPlane ( Integer  a,
Integer  b,
Integer  c,
Integer  d,
int  diameter,
unsigned int  nbtries 
)

Checks the naive plane d <= ax+by+cz <= d + max(|a|,|b|,|c|)-1

Definition at line 61 of file testChordNaivePlaneComputer.cpp.

63{
64 typedef typename NaivePlaneComputer::Point Point;
65 typedef typename Point::Component PointInteger;
67 Integer absA = ic.abs( a );
68 Integer absB = ic.abs( b );
69 Integer absC = ic.abs( c );
70 Integer x, y, z;
71 Dimension axis;
72 if ( ( absA >= absB ) && ( absA >= absC ) )
73 axis = 0;
74 else if ( ( absB >= absA ) && ( absB >= absC ) )
75 axis = 1;
76 else
77 axis = 2;
78 Point p;
80 plane.init( axis, 1, 1 );
81 // Checks that points within the naive plane are correctly recognized.
82 unsigned int nb = 0;
83 unsigned int nbok = 0;
84 while ( nb != nbtries )
85 {
86 p[ 0 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
87 p[ 1 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
88 p[ 2 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
89 x = (Integer) p[ 0 ];
90 y = (Integer) p[ 1 ];
91 z = (Integer) p[ 2 ];
92 switch ( axis ) {
93 case 0: p[ 0 ] = (PointInteger)NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - b * y - c * z, a ) ); break;
94 case 1: p[ 1 ] = (PointInteger)NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - a * x - c * z, b ) ); break;
95 case 2: p[ 2 ] = (PointInteger)NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - a * x - b * y, c ) ); break;
96 }
97 bool ok_ext = plane.isExtendable( p ); // should be ok
98 bool ok = plane.extend( p ); // should be ok
99 ++nb; nbok += ok_ext ? 1 : 0;
100 ++nb; nbok += ok ? 1 : 0;
101 if ( ! ok )
102 {
103 std::cerr << "[ERROR] p=" << p << " NOT IN plane=" << plane << std::endl;
104 for ( typename NaivePlaneComputer::ConstIterator it = plane.begin(), itE = plane.end();
105 it != itE; ++it )
106 std::cerr << " " << *it;
107 std::cerr << endl;
108 std::cerr << "d <= a*x+b*y+c*z <= d+max(a,b,c)"
109 << d << " <= " << a << "*" << p[0]
110 << "+" << b << "*" << p[1]
111 << "+" << c << "*" << p[2]
112 << " = " << (a*p[0]+b*p[1]+c*p[2])
113 << std::endl;
114 break;
115 }
116 if ( ! ok_ext )
117 {
118 std::cerr << "[ERROR] p=" << p << " was NOT extendable IN plane=" << plane << std::endl;
119 break;
120 }
121 // else
122 // std::cerr << "[OK] p=" << p << " IN plane=" << plane << std::endl;
123 }
124
125 // Checks that points outside the naive plane are correctly recognized as outliers.
126 while ( nb != (nbtries * 11 ) / 10 )
127 {
128 p[ 0 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
129 p[ 1 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
130 p[ 2 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
131 x = (Integer) p[ 0 ];
132 y = (Integer) p[ 1 ];
133 z = (Integer) p[ 2 ];
134 switch ( axis ) {
135 case 0: p[ 0 ] = (PointInteger)NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - b * y - c * z, a ) ); break;
136 case 1: p[ 1 ] = (PointInteger)NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - a * x - c * z, b ) ); break;
137 case 2: p[ 2 ] = (PointInteger)NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - a * x - b * y, c ) ); break;
138 }
139 PointInteger tmp = getRandomInteger<PointInteger>( 2, 5 )
140 * (2*getRandomInteger<PointInteger>( 0, 2 ) - 1 );
141 p[ axis ] += tmp;
142 bool ok_ext = ! plane.isExtendable( p ); // should *not* be ok
143 bool ok = ! plane.extend( p ); // should *not* be ok
144 ++nb; nbok += ok ? 1 : 0;
145 ++nb; nbok += ok_ext ? 1 : 0;
146 if ( ! ok )
147 {
148 std::cerr << "[ERROR] p=" << p << " IN plane=" << plane << std::endl;
149 break;
150 }
151 if ( ! ok_ext )
152 {
153 std::cerr << "[ERROR] p=" << p << " was extendable IN plane=" << plane << std::endl;
154 break;
155 }
156 // else
157 // std::cerr << "[OK] p=" << p << " IN plane=" << plane << std::endl;
158 }
159 return nb == nbok;
160}
void init(Dimension axis, InternalInteger diameter, InternalInteger widthNumerator=NumberTraits< InternalInteger >::ONE, InternalInteger widthDenominator=NumberTraits< InternalInteger >::ONE)
ConstIterator end() const
ConstIterator begin() const
bool isExtendable(const Point &p) const
bool extend(const Point &p)

References DGtal::IntegerComputer< TInteger >::abs(), DGtal::COBANaivePlaneComputer< TSpace, TInternalInteger >::begin(), DGtal::IntegerComputer< TInteger >::ceilDiv(), DGtal::COBANaivePlaneComputer< TSpace, TInternalInteger >::end(), DGtal::COBANaivePlaneComputer< TSpace, TInternalInteger >::extend(), DGtal::COBANaivePlaneComputer< TSpace, TInternalInteger >::init(), and DGtal::COBANaivePlaneComputer< TSpace, TInternalInteger >::isExtendable().

◆ checkPlaneGroupExtension()

template<typename Integer , typename NaivePlaneComputer >
bool checkPlaneGroupExtension ( Integer  a,
Integer  b,
Integer  c,
Integer  d,
int  diameter,
unsigned int  nbtries 
)

Checks the naive plane d <= ax+by+cz <= d + max(|a|,|b|,|c|)-1

Definition at line 167 of file testChordNaivePlaneComputer.cpp.

169{
170 typedef typename NaivePlaneComputer::Point Point;
171 typedef typename Point::Component PointInteger;
173 Integer absA = ic.abs( a );
174 Integer absB = ic.abs( b );
175 Integer absC = ic.abs( c );
176 Integer x, y, z;
177 Dimension axis;
178 if ( ( absA >= absB ) && ( absA >= absC ) )
179 axis = 0;
180 else if ( ( absB >= absA ) && ( absB >= absC ) )
181 axis = 1;
182 else
183 axis = 2;
184 Point p;
185 NaivePlaneComputer plane;
186 plane.init( axis, 1, 1 );
187 // Checks that points within the naive plane are correctly recognized.
188 unsigned int nb = 0;
189 unsigned int nbok = 0;
190 while ( nb < nbtries )
191 {
192 std::vector<Point> points( 5 );
193 for ( unsigned int i = 0; i < 5; ++i )
194 {
195 Point & pp = points[ i ];
196 pp[ 0 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
197 pp[ 1 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
198 pp[ 2 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
199 x = (Integer) pp[ 0 ];
200 y = (Integer) pp[ 1 ];
201 z = (Integer) pp[ 2 ];
202 switch ( axis ) {
203 case 0: pp[ 0 ] = (PointInteger)NumberTraits<Integer>::castToInt64_t
204 ( ic.ceilDiv( d - b * y - c * z, a ) ); break;
205 case 1: pp[ 1 ] = (PointInteger)NumberTraits<Integer>::castToInt64_t
206 ( ic.ceilDiv( d - a * x - c * z, b ) ); break;
207 case 2: pp[ 2 ] = (PointInteger)NumberTraits<Integer>::castToInt64_t
208 ( ic.ceilDiv( d - a * x - b * y, c ) ); break;
209 }
210 }
211 bool ok_ext = plane.isExtendable( points.begin(), points.end() ); // should be ok
212 bool ok = plane.extend( points.begin(), points.end() ); // should be ok
213 ++nb; nbok += ok_ext ? 1 : 0;
214 ++nb; nbok += ok ? 1 : 0;
215 if ( ! ok )
216 {
217 std::cerr << "[ERROR] p=" << points[ 0 ] << " NOT IN plane=" << plane << std::endl;
218 for ( typename NaivePlaneComputer::ConstIterator it = plane.begin(), itE = plane.end();
219 it != itE; ++it )
220 std::cerr << " " << *it;
221 std::cerr << endl;
222 std::cerr << "d <= a*x+b*y+c*z <= d+max(a,b,c)"
223 << d << " <= " << a << "*" << p[0]
224 << "+" << b << "*" << p[1]
225 << "+" << c << "*" << p[2]
226 << " = " << (a*p[0]+b*p[1]+c*p[2])
227 << std::endl;
228 break;
229 }
230 if ( ! ok_ext )
231 {
232 std::cerr << "[ERROR] p=" << p << " was NOT extendable IN plane=" << plane << std::endl;
233 break;
234 }
235 // else
236 // std::cerr << "[OK] p=" << p << " IN plane=" << plane << std::endl;
237 }
238
239 // Checks that points outside the naive plane are correctly recognized as outliers.
240 while ( nb < (nbtries * 11 ) / 10 )
241 {
242 p[ 0 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
243 p[ 1 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
244 p[ 2 ] = getRandomInteger<PointInteger>( -diameter+1, diameter );
245 x = (Integer) p[ 0 ];
246 y = (Integer) p[ 1 ];
247 z = (Integer) p[ 2 ];
248 switch ( axis ) {
249 case 0: p[ 0 ] = (PointInteger)NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - b * y - c * z, a ) ); break;
250 case 1: p[ 1 ] = (PointInteger)NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - a * x - c * z, b ) ); break;
251 case 2: p[ 2 ] = (PointInteger)NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - a * x - b * y, c ) ); break;
252 }
253 PointInteger tmp = getRandomInteger<PointInteger>( 2, 5 )
254 * (2*getRandomInteger<PointInteger>( 0, 2 ) - 1 );
255 p[ axis ] += tmp;
256 bool ok_ext = ! plane.isExtendable( p ); // should *not* be ok
257 bool ok = ! plane.extend( p ); // should *not* be ok
258 ++nb; nbok += ok ? 1 : 0;
259 ++nb; nbok += ok_ext ? 1 : 0;
260 if ( ! ok )
261 {
262 std::cerr << "[ERROR] p=" << p << " IN plane=" << plane << std::endl;
263 break;
264 }
265 if ( ! ok_ext )
266 {
267 std::cerr << "[ERROR] p=" << p << " was extendable IN plane=" << plane << std::endl;
268 break;
269 }
270 // else
271 // std::cerr << "[OK] p=" << p << " IN plane=" << plane << std::endl;
272 }
273 return nb == nbok;
274}

References DGtal::IntegerComputer< TInteger >::abs(), DGtal::COBANaivePlaneComputer< TSpace, TInternalInteger >::begin(), DGtal::IntegerComputer< TInteger >::ceilDiv(), DGtal::COBANaivePlaneComputer< TSpace, TInternalInteger >::end(), DGtal::COBANaivePlaneComputer< TSpace, TInternalInteger >::extend(), DGtal::COBANaivePlaneComputer< TSpace, TInternalInteger >::init(), and DGtal::COBANaivePlaneComputer< TSpace, TInternalInteger >::isExtendable().

◆ checkPlanes()

template<typename Integer , typename NaivePlaneComputer >
bool checkPlanes ( unsigned int  nbplanes,
int  diameter,
unsigned int  nbtries 
)

Definition at line 388 of file testChordNaivePlaneComputer.cpp.

389{
390 //using namespace Z3i;
391 //typedef ChordNaivePlaneComputer<Z3, Integer> NaivePlaneComputer;
392 unsigned int nb = 0;
393 unsigned int nbok = 0;
394 for ( unsigned int nbp = 0; nbp < nbplanes; ++nbp )
395 {
396 Integer a = getRandomInteger<Integer>( (Integer) 0, (Integer) diameter / 2 );
397 Integer b = getRandomInteger<Integer>( (Integer) 0, (Integer) diameter / 2 );
398 Integer c = getRandomInteger<Integer>( (Integer) 0, (Integer) diameter / 2 );
399 Integer d = getRandomInteger<Integer>( (Integer) 0, (Integer) diameter / 2 );
400 if ( ( a != 0 ) || ( b != 0 ) || ( c != 0 ) )
401 {
402 ++nb; nbok += checkPlane<Integer, NaivePlaneComputer>( a, b, c, d, diameter, nbtries ) ? 1 : 0;
403 if ( nb != nbok )
404 {
405 std::cerr << "[ERROR] (Simple extension) for plane " << a << " * x + "
406 << b << " * y + " << c << " * z = " << d << std::endl;
407 break;
408 }
409 ++nb; nbok += checkPlaneGroupExtension<Integer, NaivePlaneComputer>( a, b, c, d, diameter, nbtries ) ? 1 : 0;
410 if ( nb != nbok )
411 {
412 std::cerr << "[ERROR] (Group extension) for plane " << a << " * x + "
413 << b << " * y + " << c << " * z = " << d << std::endl;
414 break;
415 }
416 }
417 }
418 return nb == nbok;
419}

◆ checkWidth()

template<typename Integer , typename NaivePlaneComputer >
bool checkWidth ( Integer  a,
Integer  b,
Integer  c,
Integer  d,
int  diameter,
unsigned int  nbtries 
)

Checks the naive plane d <= ax+by+cz <= d + max(|a|,|b|,|c|)-1

Definition at line 426 of file testChordNaivePlaneComputer.cpp.

428{
429 typedef typename NaivePlaneComputer::Point Point;
430 typedef typename NaivePlaneComputer::InternalScalar InternalScalar;
431 typedef typename Point::Component PointInteger;
433 Integer absA = ic.abs( a );
434 Integer absB = ic.abs( b );
435 Integer absC = ic.abs( c );
436 Integer x, y, z;
437 Dimension axis;
438 if ( ( absA >= absB ) && ( absA >= absC ) )
439 axis = 0;
440 else if ( ( absB >= absA ) && ( absB >= absC ) )
441 axis = 1;
442 else
443 axis = 2;
444 // Checks that points within the naive plane are correctly recognized.
445 unsigned int nb = 0;
446 unsigned int nbok = 0;
447 std::vector<Point> points( nbtries );
448 for ( unsigned int i = 0; i != nbtries; ++i )
449 {
450 Point & p = points[ i ];
451 p[ 0 ] = getRandomInteger<Integer>( -diameter+1, diameter );
452 p[ 1 ] = getRandomInteger<Integer>( -diameter+1, diameter );
453 p[ 2 ] = getRandomInteger<Integer>( -diameter+1, diameter );
454 x = (Integer) p[ 0 ];
455 y = (Integer) p[ 1 ];
456 z = (Integer) p[ 2 ];
457 switch ( axis ) {
458 case 0: p[ 0 ] = (PointInteger)NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - b * y - c * z, a ) ); break;
459 case 1: p[ 1 ] = (PointInteger)NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - a * x - c * z, b ) ); break;
460 case 2: p[ 2 ] = (PointInteger)NumberTraits<Integer>::castToInt64_t( ic.ceilDiv( d - a * x - b * y, c ) ); break;
461 }
462 }
463 trace.beginBlock( "Computing axis width." );
464 trace.info() << "- plane is "
465 << d << " <= " << a << "*x"
466 << "+" << b << "*y"
467 << "+" << c << "*z"
468 << " <= d + max(|a|,|b|,|c|)"
469 << std::endl;
470 trace.info() << "- " << points.size() << " points tested in diameter " << diameter
471 << std::endl;
472 double min = -1.0;
473 for ( unsigned int i = 0; i < 3; ++i )
474 {
475 std::pair<InternalScalar, InternalScalar> width
476 = NaivePlaneComputer::computeAxisWidth( i, points.begin(), points.end() );
477 double wn = NumberTraits<InternalScalar>::castToDouble( width.first );
478 double wd = NumberTraits<InternalScalar>::castToDouble( width.second );
479 trace.info() << " (" << i << ") width=" << (wn/wd) << std::endl;
480 if ( min < 0.0 ) min = wn/wd;
481 else if ( wn/wd < min ) min = wn/wd;
482 }
483 ++nb; nbok += (min < 1.0 ) ? 1 : 0;
484 trace.info() << "(" << nbok << "/" << nb << ") min width = " << min
485 << " < 1.0" << std::endl;
486 ++nb; nbok += (0.9 < min ) ? 1 : 0;
487 trace.info() << "(" << nbok << "/" << nb << ") min width = " << min
488 << " > 0.9" << std::endl;
489 trace.endBlock();
490 return nb == nbok;
491}

References DGtal::IntegerComputer< TInteger >::abs(), DGtal::Trace::beginBlock(), DGtal::IntegerComputer< TInteger >::ceilDiv(), DGtal::Trace::endBlock(), DGtal::Trace::info(), and DGtal::trace.

◆ checkWidths()

template<typename Integer , typename NaivePlaneComputer >
bool checkWidths ( unsigned int  nbplanes,
int  diameter,
unsigned int  nbtries 
)

Definition at line 495 of file testChordNaivePlaneComputer.cpp.

496{
497 //using namespace Z3i;
498 //typedef ChordNaivePlaneComputer<Z3, Integer> NaivePlaneComputer;
499 unsigned int nb = 0;
500 unsigned int nbok = 0;
501 for ( unsigned int nbp = 0; nbp < nbplanes; ++nbp )
502 {
503 Integer a = getRandomInteger<Integer>( (Integer) 0, (Integer) diameter / 2 );
504 Integer b = getRandomInteger<Integer>( (Integer) 0, (Integer) diameter / 2 );
505 Integer c = getRandomInteger<Integer>( (Integer) 0, (Integer) diameter / 2 );
506 Integer d = getRandomInteger<Integer>( (Integer) 0, (Integer) diameter / 2 );
507 if ( ( a != 0 ) || ( b != 0 ) || ( c != 0 ) )
508 {
509 ++nb; nbok += checkWidth<Integer, NaivePlaneComputer>( a, b, c, d, diameter, nbtries ) ? 1 : 0;
510 if ( nb != nbok )
511 {
512 std::cerr << "[ERROR] (checkWidth) for plane " << a << " * x + "
513 << b << " * y + " << c << " * z = " << d << std::endl;
514 break;
515 }
516 }
517 }
518 return nb == nbok;
519}

Referenced by main().

◆ getRandomInteger()

template<typename Integer >
Integer getRandomInteger ( Integer  first,
Integer  after_last 
)

Definition at line 50 of file testChordNaivePlaneComputer.cpp.

51{
52 Integer r = (Integer) rand();
53 return ( r % (after_last - first) ) + first;
54}

◆ main()

int main ( int  ,
char **   
)

Definition at line 774 of file testChordNaivePlaneComputer.cpp.

775{
776 using namespace Z3i;
777
778 trace.beginBlock ( "Testing class ChordNaivePlaneComputer" );
779 bool res = true
781 && checkManyPlanes<ChordNaivePlaneComputer<Z3i::Space, Z3i::Point, DGtal::int32_t> >( 4, 100, 200 )
783 && checkManyPlanes<ChordNaivePlaneComputer<Z3i::Space, Z3i::Point, DGtal::int32_t> >( 20, 100, 200 )
785 && checkManyPlanes<ChordNaivePlaneComputer<Z3i::Space, Z3i::Point, DGtal::int64_t> >( 2000, 100, 200 )
787 && checkExtendWithManyPoints<ChordGenericNaivePlaneComputer<Z3i::Space, Z3i::Point, DGtal::int64_t> >( 100, 100, 200 );
788
789 trace.emphase() << ( res ? "Passed." : "Error." ) << endl;
790 trace.endBlock();
791 return res ? 0 : 1;
792}
Aim: A class that contains the chord-based algorithm for recognizing pieces of digital planes of give...
std::ostream & emphase()
std::int64_t int64_t
signed 94-bit integer.
Definition BasicTypes.h:73
bool testChordNaivePlaneComputer()
bool checkWidths(unsigned int nbplanes, int diameter, unsigned int nbtries)
bool checkManyPlanes(unsigned int diameter, unsigned int nbplanes, unsigned int nbpoints)

References DGtal::Trace::beginBlock(), checkManyPlanes(), checkWidths(), DGtal::Trace::emphase(), DGtal::Trace::endBlock(), testChordNaivePlaneComputer(), and DGtal::trace.

◆ testChordNaivePlaneComputer()

bool testChordNaivePlaneComputer ( )

Example of a test. To be completed.

Definition at line 526 of file testChordNaivePlaneComputer.cpp.

527{
528 unsigned int nbok = 0;
529 unsigned int nb = 0;
530 typedef DGtal::int64_t Integer;
531 typedef DGtal::Z3i::Z3 Space;
532 typedef DGtal::Z3i::Point Point;
534 typedef ChordGenericNaivePlaneComputer<Space, Point, Integer> GenericNaivePlaneComputer;
535
536 BOOST_CONCEPT_ASSERT(( CAdditivePrimitiveComputer< NaivePlaneComputer > ));
538 BOOST_CONCEPT_ASSERT(( boost::ForwardContainer< NaivePlaneComputer > ));
540 BOOST_CONCEPT_ASSERT(( CPointPredicate< NaivePlaneComputer::Primitive > ));
542
543 trace.beginBlock ( "Testing block: ChordNaivePlaneComputer instantiation." );
544 NaivePlaneComputer plane;
545 Point pt0( 0, 0, 0 );
546 plane.init( 2, 1, 1 );
547 bool pt0_inside = plane.extend( pt0 );
548 ++nb; nbok += pt0_inside == true ? 1 : 0;
549 trace.info() << "(" << nbok << "/" << nb << ") Plane=" << plane
550 << std::endl;
551 Point pt1( Point( 2, 0, 0 ) );
552 bool pt1_inside = plane.extend( pt1 );
553 ++nb; nbok += pt1_inside == true ? 1 : 0;
554 trace.info() << "(" << nbok << "/" << nb << ") add " << pt1
555 << " Plane=" << plane << std::endl;
556 Point pt2( Point( 0, 2, 2 ) );
557 bool pt2_inside = plane.extend( pt2 );
558 ++nb; nbok += pt2_inside == true ? 1 : 0;
559 trace.info() << "(" << nbok << "/" << nb << ") add " << pt2
560 << " Plane=" << plane << std::endl;
561
562 Point pt3( Point( 1, 1, 1 ) );
563 bool pt3_inside = plane.extend( pt3 );
564 ++nb; nbok += pt3_inside == true ? 1 : 0;
565 trace.info() << "(" << nbok << "/" << nb << ") add " << pt3
566 << " Plane=" << plane << std::endl;
567
568 Point pt4( Point( -10, -10, 10 ) );
569 bool pt4_inside = plane.extend( pt4 );
570 ++nb; nbok += pt4_inside == false ? 1 : 0;
571 trace.info() << "(" << nbok << "/" << nb << ") impossible add " << pt4
572 << " Plane=" << plane << std::endl;
573
574 Point pt5 = pt2 + Point( 1, 0, 1 );
575 bool pt5_inside = plane.extend( pt5 );
576 ++nb; nbok += pt5_inside == true ? 1 : 0;
577 trace.info() << "(" << nbok << "/" << nb << ") add " << pt5
578 << " Plane=" << plane << std::endl;
579
580 Point pt6 = pt5 + Point( 6, 0, 2 );
581 bool pt6_inside = plane.extend( pt6 );
582 ++nb; nbok += pt6_inside == true ? 1 : 0;
583 trace.info() << "(" << nbok << "/" << nb << ") add " << pt6
584 << " Plane=" << plane << std::endl;
585
586 NaivePlaneComputer plane2;
587 plane2.init( 2, 1, 1 );
588 plane2.extend( Point( 10, 0, 0 ) );
589 plane2.extend( Point( 0, 8, 0 ) );
590 plane2.extend( Point( 0, 0, 6 ) );
591 trace.info() << "(" << nbok << "/" << nb << ") "
592 << " Plane2=" << plane2 << std::endl;
593
594 ++nb; nbok += checkPlane<Integer,NaivePlaneComputer>( 11, 5, 19, 20, 100, 100 ) ? 1 : 0;
595 trace.info() << "(" << nbok << "/" << nb
596 << ") checkPlane<Integer,NaivePlaneComputer>( 11, 5, 19, 20, 100, 100 )"
597 << std::endl;
598
599 ++nb; nbok += checkGenericPlane<Integer,GenericNaivePlaneComputer>( 11, 5, 19, 20, 100, 100 ) ? 1 : 0;
600 trace.info() << "(" << nbok << "/" << nb
601 << ") checkGenericPlane<Integer,GenericNaivePlaneComputer>( 11, 5, 19, 20, 100, 100 )"
602 << std::endl;
603 ++nb; nbok += checkGenericPlane<Integer,GenericNaivePlaneComputer>( 17, 33, 7, 10, 100, 100 ) ? 1 : 0;
604 trace.info() << "(" << nbok << "/" << nb
605 << ") checkGenericPlane<Integer,GenericNaivePlaneComputer>( 17, 33, 7, 10, 100, 100 )"
606 << std::endl;
607 ++nb; nbok += checkPlane<Integer,NaivePlaneComputer>( 15, 8, 13, 15, 100, 100 ) ? 1 : 0;
608 trace.info() << "(" << nbok << "/" << nb
609 << ") checkPlane<Integer,NaivePlaneComputer>( 15, 8, 13, 15, 100, 100 )"
610 << std::endl;
611 ++nb; nbok += checkGenericPlane<Integer,GenericNaivePlaneComputer>( 15, 8, 13, 15, 100, 100 ) ? 1 : 0;
612 trace.info() << "(" << nbok << "/" << nb
613 << ") checkGenericPlane<Integer,GenericNaivePlaneComputer>( 15, 8, 13, 15, 100, 100 )"
614 << std::endl;
615 trace.endBlock();
616
617 {
618 trace.beginBlock ( "Testing block: ChordNaivePlaneComputer vertical instantiation." );
619 NaivePlaneComputer ppplane;
620 Point pppt0( 0, 0, 0 );
621 ppplane.init( 2, 5, 2 );
622 bool pppt0_inside = ppplane.extend( pppt0 );
623 ++nb; nbok += pppt0_inside == true ? 1 : 0;
624 trace.info() << "(" << nbok << "/" << nb << ") Plane=" << ppplane
625 << std::endl;
626 Point pppt1( 3, 2, 2 );
627 bool pppt1_inside = ppplane.extend( pppt1 );
628 ++nb; nbok += pppt1_inside == true ? 1 : 0;
629 trace.info() << "(" << nbok << "/" << nb << ") Plane=" << ppplane
630 << std::endl;
631 Point pppt2( 0, 0, 1 );
632 bool pppt2_inside = ppplane.extend( pppt2 );
633 ++nb; nbok += pppt2_inside == true ? 1 : 0;
634 trace.info() << "(" << nbok << "/" << nb << ") Plane=" << ppplane
635 << std::endl;
636 Point pppt3 = pppt1 + Point( 0, 0, 1 );
637 bool pppt3_inside = ppplane.extend( pppt3 );
638 ++nb; nbok += pppt3_inside == true ? 1 : 0;
639 trace.info() << "(" << nbok << "/" << nb << ") Plane=" << ppplane
640 << std::endl;
641 Point pppt4 = pppt3 + Point( 0, 0, 1 );
642 bool pppt4_inside = ppplane.extend( pt4 );
643 ++nb; nbok += pppt4_inside == true ? 1 : 0;
644 trace.info() << "(" << nbok << "/" << nb << ") Plane=" << ppplane
645 << std::endl;
646 trace.endBlock();
647 }
648
649 {
650 trace.beginBlock ( "Testing block: ChordNaivePlaneComputer vertical instantiation 2." );
651 NaivePlaneComputer pplane;
652 pplane.init( 1, 1, 1 );
653 Point ppt0( -6, -3, 5 );
654 bool ppt0_inside = pplane.extend( ppt0 );
655 ++nb; nbok += ppt0_inside == true ? 1 : 0;
656 trace.info() << "(" << nbok << "/" << nb << ") Plane=" << pplane
657 << std::endl;
658 Point ppt1( 4, 4, -5 );
659 bool ppt1_inside = pplane.extend( ppt1 );
660 ++nb; nbok += ppt1_inside == true ? 1 : 0;
661 trace.info() << "(" << nbok << "/" << nb << ") Plane=" << pplane
662 << std::endl;
663 Point ppt2( -5, -2, 4 );
664 bool ppt2_inside = pplane.extend( ppt2 );
665 ++nb; nbok += ppt2_inside == true ? 1 : 0;
666 trace.info() << "(" << nbok << "/" << nb << ") Plane=" << pplane
667 << std::endl;
668 trace.endBlock();
669 }
670
671 return nbok == nb;
672}
Aim: A class that recognizes pieces of digital planes of given axis width. When the width is 1,...
COBANaivePlaneComputer< Z3, InternalInteger > NaivePlaneComputer
Aim: Defines the concept describing an object that computes some primitive from input points given gr...
Aim: Defines a predicate on a point.
Go to http://www.sgi.com/tech/stl/ForwardContainer.html.
Definition Boost.dox:110

References DGtal::Trace::beginBlock(), DGtal::Trace::endBlock(), DGtal::COBANaivePlaneComputer< TSpace, TInternalInteger >::extend(), DGtal::Trace::info(), DGtal::COBANaivePlaneComputer< TSpace, TInternalInteger >::init(), and DGtal::trace.

Referenced by main().