32 #include "DGtal/base/Common.h"
33 #include "DGtal/kernel/SpaceND.h"
34 #include "DGtal/kernel/PointVector.h"
35 #include "DGtal/kernel/BasicPointFunctors.h"
36 #include "DGtal/base/ConstIteratorAdapter.h"
37 #include "DGtal/base/Circulator.h"
39 #include <boost/concept_check.hpp>
45 using namespace DGtal;
58 unsigned int nbok = 0;
62 typedef std::vector<Point3>::iterator Iterator3;
63 typedef std::vector<Point2>::iterator Iterator2;
69 BOOST_CONCEPT_ASSERT(( boost::RandomAccessIterator<Iterator3> ));
71 BOOST_CONCEPT_ASSERT(( boost_concepts::ReadableIteratorConcept<Adapter> ));
72 BOOST_CONCEPT_ASSERT(( boost_concepts::RandomAccessTraversalConcept<Adapter> ));
75 std::vector<Point3> r;
76 r.push_back(Point3(0,0,0));
77 r.push_back(Point3(1,0,0));
78 r.push_back(Point3(2,0,0));
79 r.push_back(Point3(2,1,0));
80 r.push_back(Point3(2,1,1));
81 r.push_back(Point3(3,1,1));
82 r.push_back(Point3(4,1,1));
83 r.push_back(Point3(4,2,1));
84 r.push_back(Point3(4,2,2));
85 r.push_back(Point3(5,2,2));
86 r.push_back(Point3(6,2,2));
87 r.push_back(Point3(6,3,2));
88 r.push_back(Point3(6,3,3));
89 r.push_back(Point3(6,4,3));
90 r.push_back(Point3(6,4,4));
91 r.push_back(Point3(6,5,4));
94 std::vector<Point2> rtrue;
95 rtrue.push_back(Point2(0,0));
96 rtrue.push_back(Point2(1,0));
97 rtrue.push_back(Point2(2,0));
98 rtrue.push_back(Point2(2,1));
99 rtrue.push_back(Point2(2,1));
100 rtrue.push_back(Point2(3,1));
101 rtrue.push_back(Point2(4,1));
102 rtrue.push_back(Point2(4,2));
103 rtrue.push_back(Point2(4,2));
104 rtrue.push_back(Point2(5,2));
105 rtrue.push_back(Point2(6,2));
106 rtrue.push_back(Point2(6,3));
107 rtrue.push_back(Point2(6,3));
108 rtrue.push_back(Point2(6,4));
109 rtrue.push_back(Point2(6,4));
110 rtrue.push_back(Point2(6,5));
114 trace.
info() <<
"2d points after projection (XY)" << endl;
118 Adapter aitBegin(r.begin(),proj);
119 Adapter ait = aitBegin;
120 Adapter aitEnd(r.end(),proj);
122 for ( ; ait != aitEnd; ++ait)
126 trace.
info() <<
"(" << ait->operator[](0) <<
", " << ait->operator[](1) <<
")" << endl;
130 if ( std::equal( rtrue.begin(), rtrue.end(), aitBegin ) ==
true )
133 trace.
info() << nbok <<
"/" << nb << std::endl;
136 trace.
info() <<
"basic operators (operator==)" << endl;
137 if ( ( ait != aitBegin ) && ( ait == aitEnd ) )
140 trace.
info() << nbok <<
"/" << nb << std::endl;
143 ait = (aitBegin + 3);
146 trace.
info() <<
"random access operators (operator+)" << endl;
147 trace.
info() << *(aitBegin.base()) << *aitBegin << endl;
149 trace.
info() << *(ait.base()) << *ait << endl;
150 if ( ( *ait == Point2(3,1) ) == true )
153 trace.
info() << nbok <<
"/" << nb << std::endl;
155 trace.
info() <<
"backward scanning" << endl;
156 std::reverse_iterator<Adapter> raitBegin( aitEnd );
157 if ( std::equal( rtrue.rbegin(), rtrue.rend(), raitBegin ) ==
true )
160 trace.
info() << nbok <<
"/" << nb << std::endl;
162 trace.
info() <<
"circular scanning" << endl;
164 if ( std::equal( rtrue.begin(), rtrue.end(), caitBegin ) ==
true )
167 trace.
info() << nbok <<
"/" << nb << std::endl;
178 int main(
int argc,
char** argv )
182 for (
int i = 0; i < argc; ++i )
186 bool res = testProjection()
188 trace.
emphase() << ( res ?
"Passed." :
"Error." ) << endl;