DGtal 1.4.0
Loading...
Searching...
No Matches
testCombinDSS.cpp
Go to the documentation of this file.
1
34#include <iostream>
35#include <fstream>
36#include <list>
37#include <vector>
38
39#include "DGtal/base/Common.h"
40#include "DGtal/helpers/StdDefs.h"
41#include "DGtal/io/boards/Board2D.h"
42#include "DGtal/geometry/curves/OneBalancedWordComputer.h"
43#include "DGtal/geometry/curves/ArithmeticalDSSComputer.h"
44#include "ConfigTest.h"
45#include "DGtal/geometry/curves/CDynamicBidirectionalSegmentComputer.h"
46#include "DGtal/geometry/curves/GreedySegmentation.h"
47
49
50using namespace std;
51using namespace DGtal;
52using namespace Z2i;
53
55// Functions for testing class CombinDSS.
57
58
60
61
62
67{
68 typedef string::const_iterator codeIterator;
69 typedef OneBalancedWordComputer< list<char>::iterator, int> OneBalancedWordComputer_list;
70 typedef OneBalancedWordComputer<codeIterator, int> OneBalancedWordComputer_string;
71
74
75 trace.beginBlock ( "Test different initialization methods" );
76
77 std::string filename = testPath + "samples/france.fc";
78 std::fstream fst;
79 fst.open (filename.c_str(), std::ios::in);
80 Contour theContour(fst);
81
82 list<char> l;
83 for ( string::const_iterator it = theContour.chain.begin(); it != theContour.chain.end(); ++it )
84 {
85 l.push_back( *it );
86 }
87
88 list<char>::iterator it = l.begin();
89
90 OneBalancedWordComputer_list C1;
91 C1.init( it, theContour.firstPoint() );
92
93 OneBalancedWordComputer_list C2;
94 C2.init( C1.begin() );
95
96 OneBalancedWordComputer_string C3;
97 C3.init( theContour );
98
99 OneBalancedWordComputer_string C4;
100 C4.init( theContour.begin() );
101
102 int nbRetract = 0;
103 while ( C3.end() != theContour.chain.end() )
104 {
105 bool b1 = C1.extendFront();
106 bool b2 = C2.extendFront();
107 bool b3 = C3.extendFront();
108 bool b4 = C4.extendFront();
109 if ( b1 && b2 && b3 && b4 )
110 {
111 }
112 else if ( !b1 && !b2 && !b3 && !b4 )
113 {
114 C1.retractBack();
115 C2.retractBack();
116 C3.retractBack();
117 C4.retractBack();
118 ++nbRetract;
119 }
120 else
121 {
122 cout << b1 << " " << b2 << " " << b3 << " " << b4 << endl;
123 cout << C1 << endl;
124 cout << C2 << endl;
125 cout << C3 << endl;
126 cout << C4 << endl;
127 return false;
128 }
129 }
130 trace.endBlock();
131 return (nbRetract == 3485) ;
132}
133
134
140{
141 typedef string::const_iterator codeIterator;
144
145 trace.beginBlock ( "Comparing to ArithmeticalDSSComputer" );
146
147 std::string filename = testPath + "samples/manche.fc";
148 std::fstream fst;
149 fst.open (filename.c_str(), std::ios::in);
150 Contour theContour(fst);
151 Contour::ConstIterator it = theContour.begin();
152 TestedType C;
153 C.init( it );
154 ReferenceType A(it);
155 A.extendFront();
156 bool res = true;
157 while ( C.end() != theContour.chain.end() )
158 {
159 bool a = A.extendFront();
160 bool c = C.extendFront();
161 if ( a ^ c )
162 {
163 res = false;
164 cout << "Extension test error\n";
165 break;
166 }
167 else if ( ! a )
168 {
169 A.retractBack();
170 C.retractBack();
171 }
172 // Compare positions
173 if ( ( C.back() != A.back() ) || ( C.front() != A.front() ) )
174 {
175 res = false;
176 cout << "Equality test error\n";
177 break;
178 }
179 // Compare arithmetic parameters
180 if ( ( C.getA() != A.a() ) || ( C.getB() != A.b() ) ||
181 ( C.getMu() != A.mu() ) || ( C.getOmega() != A.omega() ) ||
182 ( C.Uf() != A.Uf() ) || ( C.Ul() != A.Ul() ) ||
183 ( C.Lf() != A.Lf() ) || ( C.Ll() != A.Ll() )
184 )
185 {
186 cout << "Arithmetic parameters error\n";
187 cout << C << endl;
188 cout << A << endl;
189 cout << "a() " << C.getA() << " --- " << A.a() << "\n";
190 cout << "b() " << C.getB() << " --- " << A.b() << "\n";
191 cout << "mu() " << C.getMu() << " --- " << A.mu() << "\n";
192 cout << "omega()" << C.getOmega() << " --- " << A.omega() << "\n";
193 cout << "Uf() " << C.Uf() << " --- " << A.Uf() << "\n";
194 cout << "Ul() " << C.Ul() << " --- " << A.Ul() << "\n";
195 cout << "Lf() " << C.Lf() << " --- " << A.Lf() << "\n";
196 cout << "Ll() " << C.Ll() << " --- " << A.Ll() << endl;
197 res = false;
198 break;
199 }
200 }
201 trace.endBlock();
202 return res;
203}
204
205
206
208{
209
211 typedef GreedySegmentation<combinDSS> combinSegmentation;
212
213 std::string filename = testPath + "samples/BigBall.fc";
214 std::fstream fst;
215 fst.open (filename.c_str(), std::ios::in);
216 Contour theContour(fst);
217
218 trace.beginBlock ( "Test OneBalancedWordComputer in greedy segmentation" );
219 combinSegmentation combin_dec( theContour.chain.begin(), theContour.chain.end(), combinDSS() );
220 vector<combinDSS> theCombinDSS;
221 for ( combinSegmentation::SegmentComputerIterator i = combin_dec.begin();
222 i != combin_dec.end(); ++i )
223 {
224 combinDSS c( *i );
225 theCombinDSS.push_back( c );
226 }
227 bool ok = ( theCombinDSS.size() == 1593 );
228 trace.endBlock();
229
230 return ok;
231}
232
233
244{
245 trace.beginBlock ( "Example testCombinDSS-greedy" );
246
248 typedef GreedySegmentation<combinDSS> Decomposition;
249 typedef StandardDSS4<int> arithDSS;
250
251 std::stringstream ss(stringstream::in | stringstream::out);
252 ss << "31 16 11121212121212212121212212122122222322323233323333333323333323303330330030300000100010010010001000101010101111" << endl;
253 Contour theContour( ss );
254
255 Decomposition theDecomposition( theContour.chain.begin(), theContour.chain.end(), combinDSS() );
256 Point p1( 0, 0 );
257 Point p2( 31, 31 );
258 Domain domain( p1, p2 );
259 Board2D aBoard;
260 aBoard << SetMode( domain.className(), "Grid" )
261 << domain
262 << SetMode( "PointVector", "Grid" )
263 << theContour;
264 //for each segment
265 Point p;
266 p[0] = 31;
267 p[1] = 16;
268 for ( Decomposition::SegmentComputerIterator i = theDecomposition.begin();
269 i != theDecomposition.end(); ++i )
270 {
271 combinDSS segment(*i);
272 // set the position of the combinatorilDSS
273 segment.setPosition( p );
274 // Since both DSS overlap on one code, the start point of the next one is
275 // the penultimate point of the current one.
276 p = *( --( --( segment.pointEnd() )));
277
278 // Build an ArithmeticDSS from the OneBalancedWordComputer.
279 arithDSS toShow( *segment.pointBegin(), *segment.pointBegin() );
280 for (combinDSS::ConstPointIterator it = segment.pointBegin(),
281 itEnd = segment.pointEnd(); it != itEnd; ++it )
282 toShow.extendFront( *it );
283
284 aBoard << SetMode( toShow.className(), "BoundingBox" )
285 << CustomStyle( toShow.className()+"/BoundingBox", new CustomPenColor( Color::Blue ) )
286 << toShow; // draw each segment
287 }
288 aBoard.saveSVG("testCombinDSS-greedy.svg");
289 trace.endBlock();
290 return 1;
291}
292
293
295// Standard services - public :
296int main( int argc, char** argv )
297{
298 trace.beginBlock ( "Testing class CombinDSS" );
299 trace.info() << "Args:";
300 for ( int i = 0; i < argc; ++i )
301 trace.info() << " " << argv[ i ];
302 trace.info() << endl;
303
304 bool res = testOneBalancedWordComputer()
308
309 trace.emphase() << ( res ? "Passed." : "Error." ) << endl;
310 trace.endBlock();
311
312 return res ? 0 : 1;
313}
314// //
Aim: This class is a wrapper around ArithmeticalDSS that is devoted to the dynamic recognition of dig...
Aim: This class specializes a 'Board' class so as to display DGtal objects more naturally (with <<)....
Definition Board2D.h:71
static const Color Blue
Definition Color.h:419
Point firstPoint() const
ConstIterator begin() const
Aim: Computes the greedy segmentation of a range given by a pair of ConstIterators....
std::string className() const
Aim: This class represents a standard digital straight segment (DSS), ie. the sequence of simply 4-co...
void beginBlock(const std::string &keyword="")
std::ostream & emphase()
std::ostream & info()
double endBlock()
void saveSVG(const char *filename, PageSize size=Board::BoundingBox, double margin=10.0) const
Definition Board.cpp:1011
DGtal is the top-level namespace which contains all DGtal functions and types.
Trace trace
Definition Common.h:153
STL namespace.
Custom style class redefining the pen color. You may use Board2D::Color::None for transparent color.
Definition Board2D.h:313
Modifier class in a Board2D stream. Useful to choose your own mode for a given class....
Definition Board2D.h:247
Aim: Defines the concept describing a dynamic and bidirectional segment computer, ie....
int main()
Definition testBits.cpp:56
bool showGreedySegmantation()
bool testOneBalancedWordComputer()
bool testInGreedySegmentation()
FreemanChain< int > Contour
bool CompareToArithmetical()
Domain domain