DGtal  0.6.devel
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
testFrechetShortcut.cpp
1 
30 
31 #include <iostream>
32 #include <iterator>
33 #include <cstdio>
34 #include <cmath>
35 #include <fstream>
36 #include <vector>
37 
38 #include "DGtal/base/Common.h"
39 #include "DGtal/base/Exceptions.h"
40 #include "DGtal/kernel/SpaceND.h"
41 
42 #include "DGtal/kernel/domains/HyperRectDomain.h"
43 #include "DGtal/geometry/curves/FrechetShortcut.h"
44 #include "DGtal/io/boards/Board2D.h"
45 
46 #include "DGtal/io/boards/CDrawableWithBoard2D.h"
47 #include "DGtal/geometry/curves/CForwardSegmentComputer.h"
48 #include "DGtal/helpers/StdDefs.h"
49 
50 #include "DGtal/geometry/curves/GreedySegmentation.h"
51 
52 
54 
55 using namespace std;
56 using namespace DGtal;
57 using namespace LibBoard;
58 using namespace Z2i;
59 
61 // Functions for testing class FrechetShortcut.
63 
67 bool testFrechetShortcut()
68 {
69  unsigned int nbok = 0;
70  unsigned int nb = 0;
71 
72  typedef PointVector<2,int> Point;
73  typedef std::vector<Point>::iterator Iterator;
74  typedef FrechetShortcut<Iterator,int> Shortcut;
75 
76  std::vector<Point> contour;
77  contour.push_back(Point(0,0));
78  contour.push_back(Point(1,0));
79  contour.push_back(Point(2,0));
80  contour.push_back(Point(3,0));
81  contour.push_back(Point(4,0));
82  contour.push_back(Point(5,0));
83  contour.push_back(Point(6,0));
84  contour.push_back(Point(7,0));
85  contour.push_back(Point(7,1));
86  contour.push_back(Point(6,1));
87  contour.push_back(Point(5,1));
88  contour.push_back(Point(4,1));
89  contour.push_back(Point(3,1));
90  contour.push_back(Point(2,1));
91  contour.push_back(Point(3,2));
92  contour.push_back(Point(4,2));
93  contour.push_back(Point(5,2));
94  contour.push_back(Point(6,2));
95  contour.push_back(Point(7,2));
96  contour.push_back(Point(8,2));
97  contour.push_back(Point(9,2));
98 
99  trace.beginBlock ( "Testing block ..." );
100 
101  Shortcut s(5);
102  s.init(contour.begin());
103 
104  trace.info() << s << std::endl;
105 
106  while ( (s.end() != contour.end())
107  &&(s.extendForward()) ) {}
108 
109  trace.info() << s << std::endl;
110 
111 
112  trace.endBlock();
113 
114  return nbok == nb;
115 }
116 
117 
118 
119 void testFrechetShortcutConceptChecking()
120 {
121  typedef PointVector<2,int> Point;
122  typedef std::vector<Point>::const_iterator ConstIterator;
123  typedef FrechetShortcut<ConstIterator,int> Shortcut;
124  BOOST_CONCEPT_ASSERT(( CDrawableWithBoard2D<Shortcut> ));
125  BOOST_CONCEPT_ASSERT(( CForwardSegmentComputer<Shortcut> ));
126 }
127 
128 
129 bool testSegmentation()
130 {
131  unsigned int nbok = 0;
132  unsigned int nb = 0;
133 
134  typedef PointVector<2,int> Point;
135  //typedef std::vector<Point>::iterator Iterator;
136  //typedef FrechetShortcut<Iterator,int> SegmentComputer;
137 
138  std::vector<Point> contour;
139  contour.push_back(Point(0,0));
140  contour.push_back(Point(1,0));
141  contour.push_back(Point(2,0));
142  contour.push_back(Point(3,0));
143  contour.push_back(Point(4,0));
144  contour.push_back(Point(5,0));
145  contour.push_back(Point(6,0));
146  contour.push_back(Point(7,0));
147  contour.push_back(Point(7,1));
148  contour.push_back(Point(6,1));
149  contour.push_back(Point(5,1));
150  contour.push_back(Point(4,1));
151  contour.push_back(Point(3,1));
152  contour.push_back(Point(2,1));
153  contour.push_back(Point(2,2));
154  contour.push_back(Point(3,2));
155  contour.push_back(Point(4,2));
156  contour.push_back(Point(5,2));
157  contour.push_back(Point(6,2));
158  contour.push_back(Point(7,2));
159  contour.push_back(Point(8,2));
160  contour.push_back(Point(9,2));
161 
162  trace.beginBlock ( "Testing block ..." );
163 
164  typedef Curve::PointsRange::ConstIterator Iterator;
165  typedef FrechetShortcut<Iterator,int> SegmentComputer;
166 
167  Curve aCurve; //grid curve
168  aCurve.initFromVector(contour);
169 
170  typedef Curve::PointsRange Range; //range
171  Range r = aCurve.getPointsRange(); //range
172 
173  Board2D board;
174  board << r;
175  board << aCurve.getArrowsRange();
176 
177 
178  double error = 3;
179  nbok =3;
180 
181  trace.beginBlock ( "Greedy segmentation" );
182  {
183  typedef GreedySegmentation<SegmentComputer> Segmentation;
184  Segmentation theSegmentation( r.begin(), r.end(), SegmentComputer(error) );
185 
186  Segmentation::SegmentComputerIterator it = theSegmentation.begin();
187  Segmentation::SegmentComputerIterator itEnd = theSegmentation.end();
188 
189  for ( ; it != itEnd; ++it) {
190  SegmentComputer s(*it);
191  trace.info() << s << std::endl;
192  board << (*it);
193  nb++;
194  }
195 
196  trace.info() << theSegmentation << std::endl;
197  board.saveEPS("FrechetShortcutGreedySegmentationTest.eps", Board2D::BoundingBox, 5000 );
198  }
199 
200  /* Saturated segmentation does not work for FrechetShortcut
201  computer. Indeed, given two maximal Frechet shortcuts s1(begin, end) et
202  s2(begin, end), we can have s1.begin < s2.begin < s2.end <
203  s1.end. */
204 
205 
206  trace.endBlock();
207 
208  return nbok == nb;
209 }
210 
211 
212 
213 
214 
216 // Standard services - public :
217 
218 int main( int argc, char** argv )
219 {
220  trace.beginBlock ( "Testing class FrechetShortcut" );
221  trace.info() << "Args:";
222  for ( int i = 0; i < argc; ++i )
223  trace.info() << " " << argv[ i ];
224  trace.info() << endl;
225 
226  testFrechetShortcutConceptChecking();
227 
228  bool res = testFrechetShortcut() && testSegmentation(); // && ... other tests
229  trace.emphase() << ( res ? "Passed." : "Error." ) << endl;
230  trace.endBlock();
231  return res ? 0 : 1;
232 }
233 // //