DGtal 1.3.0
Loading...
Searching...
No Matches
testObjectBorder.cpp
Go to the documentation of this file.
1
31#include <iostream>
32#include <iterator>
33#include "DGtal/base/Common.h"
34#include "DGtal/kernel/SpaceND.h"
35#include "DGtal/kernel/domains/DomainPredicate.h"
36#include "DGtal/kernel/domains/HyperRectDomain.h"
37#include "DGtal/kernel/sets/DigitalSetSelector.h"
38#include "DGtal/kernel/sets/DigitalSetConverter.h"
39#include "DGtal/topology/MetricAdjacency.h"
40#include "DGtal/topology/DomainMetricAdjacency.h"
41#include "DGtal/topology/DomainAdjacency.h"
42#include "DGtal/topology/DigitalTopology.h"
43#include "DGtal/topology/Object.h"
44#include "DGtal/graph/Expander.h"
45#include "DGtal/io/boards/Board2D.h"
46
47//#include "Board/Board.h"
49
50using namespace std;
51using namespace DGtal;
52using namespace LibBoard;
54// Functions for testing class ObjectBorder.
56
57
58
59struct MyObjectStyleCustom : public DrawableWithBoard2D
60{
61 virtual void setStyle ( Board2D & aboard ) const
62 {
63 aboard.setFillColorRGBi ( 0, 169, 0 );
64 }
65};
66struct MyObjectStyleCustomRed : public DrawableWithBoard2D
67{
68 virtual void setStyle ( Board2D & aboard ) const
69 {
70 aboard.setFillColorRGBi ( 169, 0, 0 );
71 }
72};
73
74struct MyDrawStyleCustomRed : public DrawableWithBoard2D
75{
76 virtual void setStyle ( Board2D & aboard ) const
77 {
78 aboard.setFillColorRGBi ( 169, 150, 150 );
79 aboard.setPenColorRGBi ( 0, 0, 0 );
81 aboard.setLineWidth ( 1.5 );
82 }
83};
84
85struct MyDrawStyleCustomBlue : public DrawableWithBoard2D
86{
87 virtual void setStyle ( Board2D & aboard ) const
88 {
89 aboard.setFillColorRGBi ( 150, 150, 250 );
90 aboard.setPenColorRGBi ( 0, 0, 200 );
92 aboard.setLineWidth ( 1.5 );
93 }
94};
95
96struct MyDrawStyleCustomGreen : public DrawableWithBoard2D
97{
98 virtual void setStyle ( Board2D & aboard ) const
99 {
100 aboard.setFillColorRGBi ( 150, 150, 160 );
101 aboard.setPenColorRGBi ( 150, 150, 160 );
103 aboard.setLineWidth ( 1.0 );
104 }
105};
106
107
114{
115 trace.beginBlock ( "Testing Object Borders in 2D ..." );
116
117 typedef SpaceND<2> Z2; // Z^2
118 typedef Z2::Point Point;
119 typedef MetricAdjacency<Z2, 1> Adj4; // 4-adjacency type
120 typedef MetricAdjacency<Z2, 2> Adj8; // 8-adjacency type
121 typedef DigitalTopology< Adj8, Adj4 > DT8_4; //8,4 topology type
123 typedef Domain::ConstIterator DomainConstIterator;
125 typedef Object<DT8_4, DigitalSet> ObjectType;
126
127
128 Point p1 ( -20, -10 );
129 Point p2 ( 20, 10 );
130 Domain domain ( p1, p2 );
131
132 Adj4 adj4; // instance of 4-adjacency
133 Adj8 adj8; // instance of 8-adjacency
134 DT8_4 dt8_4 ( adj8, adj4, JORDAN_DT );
135
136 Point c ( 0, 0 );
137
138 //We construct a simple 3-bubbles set
139 DigitalSet bubble_set ( domain );
140 for ( DomainConstIterator it = domain.begin(); it != domain.end(); ++it )
141 {
142 int x = ( *it ) [0];
143 int y = ( *it ) [1];
144 if ( ( x*x + y*y < 82 ) ||
145 ( ( x - 14 ) * ( x - 14 ) + ( y + 1 ) * ( y + 1 ) < 17 ) ||
146 ( ( x + 14 ) * ( x + 14 ) + ( y - 1 ) * ( y - 1 ) < 17 ) )
147 bubble_set.insertNew ( *it );
148 }
149
150 ObjectType bubble ( dt8_4, bubble_set );
151
152 //Connectedness Check
153 if (bubble.computeConnectedness() == CONNECTED)
154 trace.info() << "The object is (8,4)connected." << endl;
155 else
156 trace.info() << "The object is not (8,4)connected." << endl;
157
158 //Border Computation
159 ObjectType bubbleBorder = bubble.border();
160 if (bubbleBorder.computeConnectedness() == CONNECTED)
161 trace.info() << "The object (8,4) border is connected." << endl;
162 else
163 trace.info() << "The object (8,4) border is not connected." << endl;
164
165 //Board Export
166 Board2D board;
167 board.setUnit ( Board::UCentimeter );
168
169 board << SetMode( domain.className(), "Grid" ) << domain << bubble_set;
170 board.saveSVG ( "bubble-set.svg" );
171
172 board << SetMode( bubbleBorder.className(), "DrawAdjacencies" )
173 << CustomStyle ( bubbleBorder.className(), new MyObjectStyleCustom )
174 << bubbleBorder;
175 board.saveSVG ( "bubble-object-border.svg" );
176
177 board.clear();
178
180 //the same with the reverse topology
182 DT8_4::ReverseTopology dt4_8 = dt8_4.reverseTopology();
183
184 ObjectType48 bubble2 ( dt4_8, bubble_set );
185
186 //Border Computation
187 ObjectType48 bubbleBorder2 = bubble2.border();
188 if (bubbleBorder2.computeConnectedness() == CONNECTED)
189 trace.info() << "The object (4,8) border is connected." << endl;
190 else
191 trace.info() << "The object (4,8) border is not connected." << endl;
192
193 board << SetMode( domain.className(), "Grid" ) << domain;
194 board << bubble_set
195 << SetMode( bubbleBorder2.className(), "DrawAdjacencies" )
196 << CustomStyle ( bubbleBorder2.className(), new MyObjectStyleCustom )
197 << bubbleBorder2;
198
199 board.saveSVG ( "bubble-object-border-48.svg" );
200
201 //We split the border according to its components
202 vector<ObjectType48> borders ( 30 );
203 unsigned int nbComponents;
204
205 vector<ObjectType48>::iterator it = borders.begin();
206 nbComponents = bubbleBorder2.writeComponents ( it );
207
208 trace.info() << "The Bubble object has " << nbComponents << " (4,8)-connected components" << endl;
209
210 bool flag = true;
211 for ( unsigned int k = 0;k < nbComponents ; k++ )
212 {
213 if ( flag )
214 board << SetMode( borders[k].className(), "DrawAdjacencies" ) << CustomStyle ( borders[k].className(), new MyObjectStyleCustom ) << borders[k];
215 else
216 board << SetMode( borders[k].className(), "DrawAdjacencies" ) << CustomStyle ( borders[k].className(), new MyObjectStyleCustom ) << borders[k];
217 flag = !flag;
218 }
219
220 board.saveSVG ( "bubble-object-color-borders-48.svg" );
221 trace.endBlock();
222
223 return true;
224}
225
226
233{
234 trace.beginBlock ( "Testing Board2D with Object Borders in 2D ..." );
235
236 //typedef int Integer; // choose your digital line here.
237 typedef SpaceND<2> Z2; // Z^2
238 typedef Z2::Point Point;
239 typedef MetricAdjacency<Z2, 1> Adj4; // 4-adjacency type
240 typedef MetricAdjacency<Z2, 2> Adj8; // 8-adjacency type
241 typedef DigitalTopology< Adj8, Adj4 > DT8_4; //8,4 topology type
243 typedef Domain::ConstIterator DomainConstIterator;
245 typedef Object<DT8_4, DigitalSet> ObjectType;
246
247
248 Point p1 ( -20, -10 );
249 Point p2 ( 20, 10 );
250 Domain domain ( p1, p2 );
251
252 Adj4 adj4; // instance of 4-adjacency
253 Adj8 adj8; // instance of 8-adjacency
254 DT8_4 dt8_4 ( adj8, adj4, JORDAN_DT );
255
256 Point c ( 0, 0 );
257
258 //We construct a simple 3-bubbles set
259 DigitalSet bubble_set ( domain );
260 for ( DomainConstIterator it = domain.begin(); it != domain.end(); ++it )
261 {
262 int x = ( *it ) [0];
263 int y = ( *it ) [1];
264 if ( ( x*x + y*y < 82 ) ||
265 ( ( x - 14 ) * ( x - 14 ) + ( y + 1 ) * ( y + 1 ) < 17 ) ||
266 ( ( x + 14 ) * ( x + 14 ) + ( y - 1 ) * ( y - 1 ) < 17 ) )
267 bubble_set.insertNew ( *it );
268 }
269
270 ObjectType bubble ( dt8_4, bubble_set );
271
272 //Connectedness Check
273 if (bubble.computeConnectedness() == CONNECTED)
274 trace.info() << "The object is (8,4)connected." << endl;
275 else
276 trace.info() << "The object is not (8,4)connected." << endl;
277
278 //Border Computation
279 ObjectType bubbleBorder = bubble.border();
280 if (bubbleBorder.computeConnectedness() == CONNECTED)
281 trace.info() << "The object (8,4) border is connected." << endl;
282 else
283 trace.info() << "The object (8,4) border is not connected." << endl;
284
285 //Board Export
286 Board2D board;
287 board.setUnit ( Board::UCentimeter );
288
289 board << SetMode( domain.className(), "Grid" )
290 << CustomStyle ( domain.className(), new MyDrawStyleCustomGreen )
291 << domain
292 << CustomStyle ( bubble_set.className(), new MyDrawStyleCustomRed )
293 << bubble_set;
294 board.saveSVG ( "bubble-set-dgtalboard.svg" );
295
296 board << SetMode( bubbleBorder.className(), "DrawAdjacencies" )
297 << CustomStyle ( bubbleBorder.className(), new MyDrawStyleCustomBlue )
298 << bubbleBorder;
299 board.saveSVG ( "bubble-object-border-dgtalboard.svg" );
300 board.clear();
301
302 trace.endBlock();
303 return true;
304}
305
307// Standard services - public :
308
309int main ( /* int argc, char** argv*/ )
310{
311 bool res = testObjectBorder()
312 && testBoard2D();
313 return res ? 0 : 1;
314}
315// //
Aim: This class specializes a 'Board' class so as to display DGtal objects more naturally (with <<)....
Definition: Board2D.h:71
Aim: A wrapper class around a STL associative container for storing sets of digital points within som...
Aim: Represents a digital topology as a couple of adjacency relations.
Iterator for HyperRectDomain.
Aim: Parallelepidec region of a digital space, model of a 'CDomain'.
const ConstIterator & begin() const
std::string className() const
const ConstIterator & end() const
Aim: Describes digital adjacencies in digital spaces that are defined with the 1-norm and the infinit...
Aim: An object (or digital object) represents a set in some digital space associated with a digital t...
Definition: Object.h:120
void beginBlock(const std::string &keyword="")
std::ostream & info()
double endBlock()
Board & setPenColorRGBi(unsigned char red, unsigned char green, unsigned char blue, unsigned char alpha=255)
Definition: Board.cpp:278
void clear(const DGtal::Color &color=DGtal::Color::None)
Definition: Board.cpp:152
Board & setFillColorRGBi(unsigned char red, unsigned char green, unsigned char blue, unsigned char alpha=255)
Definition: Board.cpp:305
Board & setLineWidth(double width)
Definition: Board.cpp:329
void saveSVG(const char *filename, PageSize size=Board::BoundingBox, double margin=10.0) const
Definition: Board.cpp:1012
void setUnit(Unit unit)
Definition: Board.cpp:240
Board & setLineStyle(Shape::LineStyle style)
DGtal is the top-level namespace which contains all DGtal functions and types.
@ CONNECTED
Definition: Topology.h:52
Trace trace
Definition: Common.h:154
STL namespace.
DigitalSetByAssociativeContainer< Domain, std::unordered_set< typename Domain::Point > > Type
virtual void setStyle(Board2D &) const
Definition: Common.h:226
Modifier class in a Board2D stream. Useful to choose your own mode for a given class....
Definition: Board2D.h:247
Struct representing a 2D point.
Definition: Point.h:27
bool testObjectBorder()
bool testBoard2D()
int main()
Domain domain
HyperRectDomain< Space > Domain
Z2i::DigitalSet DigitalSet