45#include "DGtal/base/Common.h"
46#include "DGtal/base/Exceptions.h"
47#include "DGtal/kernel/SpaceND.h"
48#include "DGtal/kernel/domains/HyperRectDomain.h"
49#include "DGtal/geometry/curves/ArithmeticalDSSComputer.h"
50#include "DGtal/io/boards/Board2D.h"
52#include "DGtal/geometry/curves/CDynamicBidirectionalSegmentComputer.h"
53#include "DGtal/io/boards/CDrawableWithBoard2D.h"
70 typedef std::vector<Point>::iterator
Iterator;
73 std::vector<Point> contour;
74 contour.push_back(
Point(0,0));
75 contour.push_back(
Point(1,0));
76 contour.push_back(
Point(1,1));
77 contour.push_back(
Point(2,1));
78 contour.push_back(
Point(2,1));
79 contour.push_back(
Point(3,1));
80 contour.push_back(
Point(3,2));
81 contour.push_back(
Point(4,2));
82 contour.push_back(
Point(5,2));
83 contour.push_back(
Point(6,2));
84 contour.push_back(
Point(6,3));
85 contour.push_back(
Point(6,4));
89 trace.beginBlock(
"Add points while it is possible and draw the result");
91 DSS4Computer theDSS4Computer;
92 theDSS4Computer.init( contour.begin() );
93 trace.info() << theDSS4Computer << std::endl;
95 while ( (theDSS4Computer.end() != contour.end())
96 &&(theDSS4Computer.extendFront()) ) {}
98 trace.info() << theDSS4Computer << std::endl;
100 DSS4Computer::Primitive theDSS4 = theDSS4Computer.primitive();
108 board <<
SetMode(
"PointVector",
"Grid");
110 board <<
SetMode(theDSS4.className(),
"Points")
112 board <<
SetMode(theDSS4.className(),
"BoundingBox")
131 typedef std::vector<Point>::iterator
Iterator;
134 std::vector<Point> boundary;
135 boundary.push_back(
Point(0,0));
136 boundary.push_back(
Point(1,1));
137 boundary.push_back(
Point(2,1));
138 boundary.push_back(
Point(3,2));
139 boundary.push_back(
Point(4,2));
140 boundary.push_back(
Point(5,2));
141 boundary.push_back(
Point(6,3));
142 boundary.push_back(
Point(6,4));
145 trace.beginBlock(
"Add points while it is possible and draw the result");
146 DSS8Computer theDSS8Computer;
147 theDSS8Computer.init( boundary.begin() );
149 trace.info() << theDSS8Computer << std::endl;
151 while ( (theDSS8Computer.end()!=boundary.end())
152 &&(theDSS8Computer.extendFront()) ) {}
154 trace.info() << theDSS8Computer << std::endl;
156 DSS8Computer::Primitive theDSS8 = theDSS8Computer.primitive();
164 board <<
SetMode(
"PointVector",
"Both");
166 board <<
SetMode(theDSS8.className(),
"Points")
168 board <<
SetMode(theDSS8.className(),
"BoundingBox")
187 std::vector<Point> contour;
188 contour.push_back(
Point(0,0));
189 contour.push_back(
Point(1,0));
190 contour.push_back(
Point(1,1));
191 contour.push_back(
Point(2,1));
192 contour.push_back(
Point(3,1));
193 contour.push_back(
Point(3,2));
194 contour.push_back(
Point(4,2));
195 contour.push_back(
Point(5,2));
196 contour.push_back(
Point(6,2));
197 contour.push_back(
Point(6,3));
199 typedef std::vector<Point>::const_iterator
Iterator;
203 typedef Computer::Primitive Primitive;
205 std::deque<Primitive> v1,v2;
207 trace.beginBlock(
"Checking consistency between adding and removing");
210 trace.info() <<
"forward scan" << std::endl;
213 c.init( contour.begin() );
214 v1.push_back( c.primitive() );
216 while ( (c.end() != contour.end())
217 &&(c.extendFront()) ) {
218 v1.push_back( c.primitive() );
220 ASSERT(contour.size() == v1.size());
223 trace.info() <<
"backward scan" << std::endl;
226 rc.init( contour.rbegin() );
228 while ( (rc.end() != contour.rend())
229 &&(rc.extendFront()) )
234 trace.info() <<
"removing" << std::endl;
236 v2.push_front( rc.primitive() );
237 while (rc.retractBack()) {
238 v2.push_front( rc.primitive() );
240 ASSERT(v1.size() == v2.size());
243 trace.info() <<
"comparison" << std::endl;
246 for (
unsigned int k = 0; k < v1.size(); k++) {
247 if (v1.at(k) != v2.at(k))
249 trace.info() <<
"DSS :" << k << std::endl;
250 trace.info() << v1.at(k) << std::endl << v2.at(k) << std::endl;
254 trace.info() <<
"ok for the " << v1.size() <<
" DSS" << std::endl;
256 trace.info() <<
"failure" << std::endl;
263template<
typename Iterator>
273 while ( (theDSS4.end() != l )
274 &&(theDSS4.extendFront()) ) {}
276 ASSERT( theDSS4.isValid() );
279 bool flagIsInside =
true;
280 for (
Iterator i = theDSS4.begin(); i != theDSS4.end(); ++i)
282 if ( !theDSS4.isInDSS(i) )
283 flagIsInside =
false;
286 bool flagIsOutside =
true;
289 if ( theDSS4.isInDSS(i) )
290 flagIsOutside =
false;
292 return (flagIsInside && flagIsOutside);
302 typedef std::vector<Point>::iterator
Iterator;
308 std::vector<Point> contour;
309 contour.push_back(
Point(0,0));
310 contour.push_back(
Point(1,1));
311 contour.push_back(
Point(2,1));
312 contour.push_back(
Point(3,1));
313 contour.push_back(
Point(4,1));
314 contour.push_back(
Point(4,2));
315 contour.push_back(
Point(5,2));
316 contour.push_back(
Point(6,2));
317 contour.push_back(
Point(6,3));
318 contour.push_back(
Point(7,3));
320 std::vector<Point> contour2;
321 contour2.push_back(
Point(0,0));
322 contour2.push_back(
Point(1,-1));
323 contour2.push_back(
Point(2,-1));
324 contour2.push_back(
Point(3,-1));
325 contour2.push_back(
Point(4,-1));
326 contour2.push_back(
Point(4,-2));
327 contour2.push_back(
Point(5,-2));
328 contour2.push_back(
Point(6,-2));
329 contour2.push_back(
Point(6,-3));
330 contour2.push_back(
Point(7,-3));
332 trace.beginBlock(
"isInside tests for each of the four quadrants");
339 trace.info() << nbok <<
" / " << nb <<
" quadrants" << std::endl;
348 trace.info() << nbok <<
" / " << nb <<
" quadrants" << std::endl;
357 trace.info() << nbok <<
" / " << nb <<
" quadrants" << std::endl;
361 Iterator itb = contour2.begin() + 1;
366 trace.info() << nbok <<
" / " << nb <<
" quadrants" << std::endl;
384 typedef std::vector<Point>::iterator
Iterator;
389 trace.beginBlock(
"Add some points of big coordinates");
391 std::vector<Point> contour;
392 contour.push_back(
Point(1000000000,1000000000));
393 contour.push_back(
Point(1000000001,1000000000));
394 contour.push_back(
Point(1000000002,1000000000));
395 contour.push_back(
Point(1000000003,1000000000));
396 contour.push_back(
Point(1000000003,1000000001));
397 contour.push_back(
Point(1000000004,1000000001));
398 contour.push_back(
Point(1000000005,1000000001));
399 contour.push_back(
Point(1000000005,1000000002));
402 theDSS4.init( contour.begin() );
403 while ( (theDSS4.end() != contour.end())
404 &&(theDSS4.extendFront()) ) {}
406 trace.info() << theDSS4 <<
" " << theDSS4.isValid() << std::endl;
409 if( (theDSS4.a() == 2)
411 &&(theDSS4.mu() == mu)
412 &&(theDSS4.omega() == 7) ) {
433 typedef std::vector<Point>::iterator
Iterator;
436 std::vector<Point> boundary;
437 boundary.push_back(
Point(10,10));
438 boundary.push_back(
Point(10,11));
439 boundary.push_back(
Point(11,11));
441 trace.beginBlock(
"test Corner with 8-adjacency");
444 theDSS8.init(boundary.begin());
445 std::cerr << theDSS8 << std::endl;
446 theDSS8.extendFront();
447 std::cerr << theDSS8 << std::endl;
448 bool res = ( !theDSS8.extendFront() );
449 std::cerr << theDSS8 << std::endl;
461 typedef std::vector<Point>::iterator
Iterator;
470 trace.beginBlock (
"Testing class ArithmeticalDSSComputer" );
471 trace.info() <<
"Args:";
472 for (
int i = 0; i < argc; ++i )
473 trace.info() <<
" " << argv[ i ];
474 trace.info() << endl;
488 trace.emphase() << ( res ?
"Passed." :
"Error." ) << endl;
Aim: This class is a wrapper around ArithmeticalDSS that is devoted to the dynamic recognition of dig...
void init(const ConstIterator &it)
Aim: This class specializes a 'Board' class so as to display DGtal objects more naturally (with <<)....
Aim: Parallelepidec region of a digital space, model of a 'CDomain'.
Aim: Implements basic operations that will be used in Point and Vector classes.
This class adapts any bidirectional iterator so that operator++ calls operator-- and vice versa.
void saveSVG(const char *filename, PageSize size=Board::BoundingBox, double margin=10.0) const
DGtal is the top-level namespace which contains all DGtal functions and types.
boost::multiprecision::number< boost::multiprecision::cpp_int_backend<>, boost::multiprecision::et_off > BigInteger
Modifier class in a Board2D stream. Useful to choose your own mode for a given class....
Aim: Defines the concept describing a dynamic and bidirectional segment computer, ie....
Struct representing a 2D point.
void testArithmeticalDSSComputerConceptChecking()
bool testExtendRetractFront()
bool testIsInsideForOneQuadrant(const Iterator &k, const Iterator &l, const Iterator &ite)