DGtal  0.9.3
Functions
testMesh.cpp File Reference
#include <iostream>
#include "DGtal/base/Common.h"
#include "DGtal/helpers/StdDefs.h"
#include "DGtal/io/writers/MeshWriter.h"
#include "DGtal/shapes/Mesh.h"
Include dependency graph for testMesh.cpp:

Go to the source code of this file.

Functions

bool testMesh ()
 
bool testMeshGeneration ()
 
bool testVisualTubularMesh ()
 
int main (int argc, char **argv)
 

Detailed Description

This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.

Author
Bertrand Kerautret (kerau.nosp@m.tre@.nosp@m.loria.nosp@m..fr ) LORIA (CNRS, UMR 7503), University of Nancy, France
Date
2012/07/02

Functions for testing class 3DMeshFromPoints.

This file is part of the DGtal library.

Definition in file testMesh.cpp.

Function Documentation

◆ main()

int main ( int  argc,
char **  argv 
)

Definition at line 395 of file testMesh.cpp.

References DGtal::Trace::beginBlock(), DGtal::Trace::emphase(), DGtal::Trace::endBlock(), DGtal::Trace::info(), testMesh(), testMeshGeneration(), testVisualTubularMesh(), and DGtal::trace.

396 {
397  trace.beginBlock ( "Testing class Mesh" );
398  trace.info() << "Args:";
399  for ( int i = 0; i < argc; ++i )
400  trace.info() << " " << argv[ i ];
401  trace.info() << endl;
402 
403  bool res = testMesh() && testMeshGeneration() && testVisualTubularMesh();
404  trace.emphase() << ( res ? "Passed." : "Error." ) << endl;
405  trace.endBlock();
406  return res ? 0 : 1;
407 }
void beginBlock(const std::string &keyword="")
Trace trace
Definition: Common.h:137
bool testVisualTubularMesh()
Definition: testMesh.cpp:302
double endBlock()
std::ostream & emphase()
bool testMesh()
Definition: testMesh.cpp:51
std::ostream & info()
bool testMeshGeneration()
Definition: testMesh.cpp:212

◆ testMesh()

bool testMesh ( )

Test the mesh object construction.

Definition at line 51 of file testMesh.cpp.

References DGtal::Mesh< TPoint >::addQuadFace(), DGtal::Mesh< TPoint >::addTriangularFace(), DGtal::Mesh< TPoint >::addVertex(), DGtal::Trace::beginBlock(), DGtal::Mesh< TPoint >::changeScale(), DGtal::Trace::endBlock(), DGtal::Mesh< TPoint >::faceBegin(), DGtal::Mesh< TPoint >::faceEnd(), DGtal::Mesh< TPoint >::getBoundingBox(), DGtal::Mesh< TPoint >::getFace(), DGtal::Mesh< TPoint >::getFaceBarycenter(), DGtal::Mesh< TPoint >::getFaceColor(), DGtal::Mesh< TPoint >::getVertex(), DGtal::Trace::info(), DGtal::Mesh< TPoint >::nbFaces(), DGtal::Mesh< TPoint >::nbVertex(), DGtal::Mesh< TPoint >::quadToTriangularFaces(), DGtal::Color::Red, DGtal::Mesh< TPoint >::removeFaces(), DGtal::Mesh< TPoint >::setFaceColor(), DGtal::Mesh< TPoint >::subDivideTriangularFaces(), DGtal::trace, DGtal::Mesh< TPoint >::vertexBegin(), DGtal::Mesh< TPoint >::vertexEnd(), and DGtal::Color::White.

Referenced by main().

52 {
53 
54  trace.beginBlock ( "Testing Mesh ..." );
55  bool ok = true;
56  trace.beginBlock ( "Testing Mesh contruction ..." );
57  Mesh<Point> aMesh;
58  Point p0=Point(0,0);
59  Point p1=Point(0,1);
60  Point p2=Point(1,2);
61  Point p3=Point(3,2);
62  Point p4=Point(3,3);
63  Point p5=Point(3,4);
64 
65  aMesh.addVertex(p0);
66  aMesh.addVertex(p1);
67  aMesh.addVertex(p2);
68  aMesh.addVertex(p3);
69  aMesh.addVertex(p4);
70  aMesh.addVertex(p5);
71 
72  aMesh.addTriangularFace(0,1,2);
73  aMesh.addTriangularFace(3,4,5);
74 
75  Mesh<Point>::MeshFace tface0 = aMesh.getFace(0);
76  Mesh<Point>::MeshFace tface1 = aMesh.getFace(1);
77  Point p0f0 = aMesh.getVertex(tface0.at(0));
78  Point p1f0 = aMesh.getVertex(tface0.at(1));
79  Point p2f0 = aMesh.getVertex(tface0.at(2));
80 
81  Point p0f1 = aMesh.getVertex(tface1.at(0));
82  Point p1f1 = aMesh.getVertex(tface1.at(1));
83  Point p2f1 = aMesh.getVertex(tface1.at(2));
84  trace.info() << "Set of points" << endl;
85  trace.info() << p0 << p1 << p2 << endl;
86  trace.info() << p3 << p4 << p5 << endl;
87 
88  trace.info() << "Face1 points " << endl;
89  trace.info() << p0f0 << p1f0 << p2f0<< endl;
90 
91  trace.info() << "Face2 points " << endl;
92  trace.info() << p0f1 << p1f1 << p2f1<< endl;
93 
94 
95  bool okMeshConstruct = (p0==p0f0) && (p1==p1f0) && (p2==p2f0) &&
96  (p3==p0f1) && (p4==p1f1) && (p5==p2f1) ;
97 
98  trace.endBlock();
99  bool okMeshIterators = true;
100  trace.beginBlock ( "Testing Mesh iterator ..." );
101  unsigned int nb=0;
102  // just testing nb iterations on const iterator
104  it !=aMesh.vertexEnd();
105  it++){
106  nb++;
107  }
108  okMeshIterators = okMeshIterators && (nb == aMesh.nbVertex());
109  if (nb == aMesh.nbVertex())
110  trace.info() << "vertex iteration test ok"<<std::endl;
111 
112  // testing to change vertex on iterator
114  it !=aMesh.vertexEnd();
115  it++){
116  (*it)[0]+=10.0; (*it)[1]+=5.0;
117  }
118  // just testing nb iterations on const iterator
119  nb=0;
121  it !=aMesh.faceEnd();
122  it++){
123  nb++;
124  }
125  okMeshIterators = okMeshIterators && (nb == aMesh.nbFaces());
126  if (nb == aMesh.nbFaces())
127  trace.info() << "face iteration test ok"<<std::endl;
128 
129  nb=0;
130  // just testing nb iterations on const iterator
132  it !=aMesh.faceEnd();
133  it++){
134  nb++;
135  }
136  okMeshIterators = okMeshIterators && ((nb == aMesh.nbFaces()) && ((aMesh.getVertex(5))[0]==13)) && aMesh.getFaceBarycenter(0)==Mesh<Point>::RealPoint(31.0/3.0,6.0);
137  if ((nb == aMesh.nbFaces()) && (aMesh.getVertex(5))[0]==13 && aMesh.getFaceBarycenter(0)==Mesh<Point>::RealPoint(31.0/3.0,6.0))
138  trace.info() << "getVertex and getFaceCenter tests ok"<<std::endl;
139 
140  // testing changing color of individual face:
142  bool okMeshColor = (aMesh.getFaceColor(0)==DGtal::Color::White)
143  && (aMesh.getFaceColor(1)==DGtal::Color::Red) ;
144 
145  trace.endBlock();
146 
147  trace.beginBlock ( "Testing Mesh Bouding box and scale change ..." );
148  aMesh.changeScale(2.0);
149  std::pair<Point, Point> bb = aMesh.getBoundingBox();
150  bool boundingBoxOK = (bb.first == Point(20,10)) && (bb.second == Point(26,18));
151  trace.info() << "bouding box=" << bb.first << " " << bb.second << "(should be (20,10) (26,18)" <<std::endl;
152  trace.endBlock();
153  trace.beginBlock ( "Testing mesh subdivision ..." );
154  Mesh<RealPoint> aMeshR;
155  RealPoint pr0 (0,0);
156  RealPoint pr1 (1,0);
157  RealPoint pr2 (1,1);
158  aMeshR.addVertex(pr0); aMeshR.addVertex(pr1); aMeshR.addVertex(pr2);
159  aMeshR.addTriangularFace(0,1,2);
160  aMeshR.subDivideTriangularFaces(0.5);
161 
162  trace.info() << "nb vertex after subdivision: " << aMeshR.nbVertex() << std::endl;
163  trace.info() << "nb faces after subdivision: " << aMeshR.nbFaces() << std::endl;
164  trace.info() << "New point: " << aMeshR.getVertex(aMeshR.nbVertex()-1) << std::endl;
165  bool okSubDivide = aMeshR.nbVertex()==4 && aMeshR.nbFaces()==3 &&
166  aMeshR.getVertex(aMeshR.nbVertex()-1) == RealPoint(2.0/3.0, 1.0/3.0);
167  trace.endBlock();
168 
169  trace.beginBlock ( "Testing mesh quad transform ..." );
170  Mesh<RealPoint> aMeshQ;
171  RealPoint pq0 (0,0);
172  RealPoint pq1 (1,0);
173  RealPoint pq2 (1,1);
174  RealPoint pq3 (0,1);
175  aMeshQ.addVertex(pq0); aMeshQ.addVertex(pq1); aMeshQ.addVertex(pq2);
176  aMeshQ.addVertex(pq3);
177  aMeshQ.addQuadFace(0,1,2,3);
178  aMeshQ.quadToTriangularFaces();
179 
180  trace.info() << "nb faces after quad to triangle transform: " << aMeshQ.nbFaces() << std::endl;
181  bool okQuadToTrans = aMeshQ.nbFaces() == 2;
182  trace.endBlock();
183 
184 
185  trace.beginBlock ( "Testing Mesh copy operator ..." );
186  Mesh<Point> aMesh2 = aMesh;
187  Mesh<Point> aMesh3 (aMesh2);
188  bool okMeshCopy = aMesh.nbFaces() == aMesh2.nbFaces() && aMesh.nbVertex() == aMesh2.nbVertex() &&
189  aMesh.nbFaces() == aMesh3.nbFaces() && aMesh.nbVertex() == aMesh3.nbVertex() &&
190  aMesh.getVertex(0) == aMesh2.getVertex(0) && aMesh.getVertex(0) == aMesh3.getVertex(0);
191  trace.endBlock();
192 
193  trace.beginBlock ( "Testing face removing ..." );
194  Mesh<Point> aMesh4 = aMesh;
195  std::vector<unsigned int> f = {1};
196  aMesh4.removeFaces(f);
197  bool okRemoveFace = (aMesh4.nbFaces() == aMesh.nbFaces()-1) && (aMesh4.nbVertex() == aMesh.nbVertex()-3);
198 
199 
200  ok = ok & okMeshConstruct && okMeshIterators && okMeshColor && okMeshCopy && boundingBoxOK &&
201  okSubDivide && okQuadToTrans && okRemoveFace;
202  trace.endBlock();
203  return ok;
204 
205 }
void beginBlock(const std::string &keyword="")
std::vector< unsigned int > MeshFace
Definition: Mesh.h:116
void changeScale(const double aScale)
Trace trace
Definition: Common.h:137
void addQuadFace(unsigned int indexVertex1, unsigned int indexVertex2, unsigned int indexVertex3, unsigned int indexVertex4, const DGtal::Color &aColor=DGtal::Color::White)
void removeFaces(const std::vector< unsigned int > &facesIndex)
unsigned int nbVertex() const
unsigned int nbFaces() const
Aim: This class is defined to represent a surface mesh through a set of vertices and faces...
Definition: Mesh.h:91
FaceStorage::const_iterator faceEnd() const
Definition: Mesh.h:405
double endBlock()
ConstIterator vertexBegin() const
Definition: Mesh.h:350
const TPoint & getVertex(unsigned int i) const
void addVertex(const TPoint &vertex)
const Color & getFaceColor(unsigned int i) const
std::pair< TPoint, TPoint > getBoundingBox() const
void addTriangularFace(unsigned int indexVertex1, unsigned int indexVertex2, unsigned int indexVertex3, const DGtal::Color &aColor=DGtal::Color::White)
ConstIterator vertexEnd() const
Definition: Mesh.h:360
MyPointD Point
Definition: testClone2.cpp:383
FaceStorage::const_iterator faceBegin() const
Definition: Mesh.h:393
const MeshFace & getFace(unsigned int i) const
void setFaceColor(unsigned int i, const DGtal::Color &aColor)
std::ostream & info()
RealPoint getFaceBarycenter(unsigned int i) const
unsigned int quadToTriangularFaces()
static const Color White
Definition: Color.h:390
static const Color Red
Definition: Color.h:391
double subDivideTriangularFaces(const double minArea)

◆ testMeshGeneration()

bool testMeshGeneration ( )

Test mesh generation from static fonctions.

[testMeshCreateSkeleton]

[testMeshCreateSkeleton]

[testMeshCreateTubeMesh]

[testMeshCreateTubeMesh]

[testMeshCreateHeightSequence]

[testMeshCreateHeightSequence]

[testMeshCreateSequenceMesh]

[testMeshCreateSequenceMesh]

[testMeshExport]

[testMeshExport]

Definition at line 212 of file testMesh.cpp.

References DGtal::Trace::beginBlock(), DGtal::Color::Blue, DGtal::Trace::endBlock(), DGtal::MeshWriter< TPoint >::export2OFF(), DGtal::Color::Green, DGtal::Trace::info(), DGtal::Mesh< TPoint >::nbFaces(), DGtal::Mesh< TPoint >::nbVertex(), DGtal::trace, and DGtal::Color::Yellow.

Referenced by main().

213 {
214 
215  trace.beginBlock ( "Testing Mesh generation ..." );
216  bool ok = true;
217 
218  trace.beginBlock ( "Testing Tube generation ..." );
220  std::vector<Z3i::RealPoint> aSkeleton;
221  aSkeleton.push_back(Z3i::RealPoint(0.0, 0.0, 0.0));
222  aSkeleton.push_back(Z3i::RealPoint(10.0, 0.0, 0.0));
223  aSkeleton.push_back(Z3i::RealPoint(20.0, 0.0, 0.0));
224  aSkeleton.push_back(Z3i::RealPoint(30.0, 0.0, 0.0));
225  aSkeleton.push_back(Z3i::RealPoint(35.0, 5.0, 0.0));
226  aSkeleton.push_back(Z3i::RealPoint(40.0, 10.0, 0.0));
227  aSkeleton.push_back(Z3i::RealPoint(40.0, 20.0, 0.0));
228  aSkeleton.push_back(Z3i::RealPoint(40.0, 30.0, 0.0));
229  aSkeleton.push_back(Z3i::RealPoint(40.0, 35.0, 5.0));
230  aSkeleton.push_back(Z3i::RealPoint(40.0, 40.0, 10.0));
231  aSkeleton.push_back(Z3i::RealPoint(40.0, 40.0, 20.0));
233 
235  Mesh<Z3i::RealPoint> aMesh(true);
236  Mesh<Z3i::RealPoint>::createTubularMesh(aMesh, aSkeleton, 0.5, 0.2, DGtal::Color::Blue);
238 
239  trace.endBlock();
240  trace.info() << "Nb faces: "<< aMesh.nbFaces() << " (sould be 320)" << std::endl;
241  trace.info() << "Nb vertices: "<< aMesh.nbVertex() << " (sould be 352)" << std::endl;
242  bool okMeshTube1 = aMesh.nbFaces() == 320 && aMesh.nbVertex() == 352;
243 
244  trace.beginBlock ( "Testing Tube generation (bis with variable raidii ..." );
245  Mesh<Z3i::RealPoint> aMeshBis(true);
246  std::vector<double> vectRadii;
247  vectRadii.push_back(0.5);
248  vectRadii.push_back(1.5);
249  vectRadii.push_back(2.5);
250  Mesh<Z3i::RealPoint>::createTubularMesh(aMeshBis, aSkeleton, vectRadii, 0.2, DGtal::Color::Green);
251 
252  trace.endBlock();
253  trace.info() << "Nb faces: "<< aMeshBis.nbFaces() << " (sould be 320)" << std::endl;
254  trace.info() << "Nb vertices: "<< aMeshBis.nbVertex() << " (sould be 352)" << std::endl;
255 
256  std::ofstream ofbis ("tubeVariableRadiiGeneratedFromTestMesh.off");
257  DGtal::MeshWriter<Z3i::RealPoint>::export2OFF(ofbis, aMeshBis, true);
258  ofbis.close();
259  bool okMeshTube1bis = aMeshBis.nbFaces() == 320 && aMeshBis.nbVertex() == 352;
260 
261 
262  trace.beginBlock("Testing Mesh from Height sequence");
264  std::vector<double> heightSequence;
265  heightSequence.push_back(0.1);
266  heightSequence.push_back(0.2);
267  heightSequence.push_back(0.15);
268 
269  heightSequence.push_back(1.1);
270  heightSequence.push_back(2.2);
271  heightSequence.push_back(1.15);
272 
273  heightSequence.push_back(0.1);
274  heightSequence.push_back(0.2);
275  heightSequence.push_back(0.15);
277 
279  Mesh<Z3i::RealPoint>::createMeshFromHeightSequence(aMesh, heightSequence, 3, 10, 10, 3, DGtal::Color::Yellow);
281 
282  trace.info() << "Nb faces: "<< aMesh.nbFaces() << " (sould be 324)" << std::endl;
283  trace.info() << "Nb vertices: "<< aMesh.nbVertex() << " (sould be 361)" << std::endl;
284  bool okMeshTube1AndHF = aMesh.nbFaces() == 324 && aMesh.nbVertex() == 361;
285 
287  std::ofstream of ("tubeAndHeighFieldGeneratedFromTestMesh.off");
289  of.close();
291 
292  ok = ok & okMeshTube1 & okMeshTube1bis & okMeshTube1AndHF;
293  trace.endBlock();
294  return ok;
295 }
void beginBlock(const std::string &keyword="")
Trace trace
Definition: Common.h:137
Aim: This class is defined to represent a surface mesh through a set of vertices and faces...
Definition: Mesh.h:91
double endBlock()
static bool export2OFF(std::ostream &out, const Mesh< TPoint > &aMesh, bool exportColor=true)
Aim: Implements basic operations that will be used in Point and Vector classes.
Definition: PointVector.h:141
static const Color Yellow
Definition: Color.h:397
static const Color Blue
Definition: Color.h:394
std::ostream & info()
static const Color Green
Definition: Color.h:392

◆ testVisualTubularMesh()

bool testVisualTubularMesh ( )

Test the mesh object construction.

Definition at line 302 of file testMesh.cpp.

References DGtal::Trace::beginBlock(), DGtal::Color::Blue, DGtal::Mesh< TPoint >::createTubularMesh(), DGtal::Trace::endBlock(), DGtal::Trace::info(), max(), DGtal::Mesh< TPoint >::nbFaces(), and DGtal::trace.

Referenced by main().

303 {
304  unsigned int nbok = 0;
305  unsigned int nb = 0;
306 
307  trace.beginBlock("Testing visual tubular mesh generation (shell mesh):");
308  // Generate the center line:
309  std::vector<Z3i::RealPoint> centerline;
310  unsigned int nbPoints = 0;
311  double z = 0.0;
312  double radiusSpirale = 13.0;
313  double radiusTube = 15.0;
314  double alphaMax = 32.0;
315  double reduc = 0.05;
316  for (double alpha = 0; alpha< alphaMax; alpha += 0.1, z += 0.5-reduc)
317  {
318  centerline.push_back(Z3i::RealPoint(radiusSpirale*cos(alpha), radiusSpirale*sin(alpha), z ));
319  nbPoints++;
320  radiusSpirale -=reduc;
321  radiusSpirale = std::max(radiusSpirale, 0.0);
322  }
323  // Generate radius:
324  std::vector<double> vectRadius;
325  for(unsigned int i=0; i<nbPoints; i++)
326  {
327  vectRadius.push_back(radiusTube);
328  radiusTube -=reduc;
329  radiusTube = std::max(radiusTube, 0.0);
330  }
331 
332  DGtal::Mesh<Z3i::RealPoint> theMeshShell(true);
333  DGtal::Mesh<Z3i::RealPoint>::createTubularMesh(theMeshShell, centerline, vectRadius, 0.1);
334 
335  trace.info() << "Mesh generated with " << theMeshShell.nbFaces()
336  << " faces (should be " << (centerline.size()-1)*63 << " )" << std::endl;
337  nb++;
338  nbok += theMeshShell.nbFaces() == (centerline.size()-1)*63;
339  theMeshShell >> "spiraleGeneratedFromTestMesh.off";
340  trace.info() << " [done]" << std::endl;
341  trace.endBlock();
342 
343 
344 
345  trace.beginBlock("Testing visual tubular mesh generation (tube mesh):");
346  std::vector<Z3i::RealPoint> centerLine2;
347  centerLine2.push_back(Z3i::RealPoint(0.0,0.0,0.0));
348  centerLine2.push_back(Z3i::RealPoint(3.3,0.0,0.0));
349  centerLine2.push_back(Z3i::RealPoint(6.6,0.0,0.0));
350  centerLine2.push_back(Z3i::RealPoint(10.0,0.0,0.0));
351  centerLine2.push_back(Z3i::RealPoint(13.3,0.0,0.0));
352  centerLine2.push_back(Z3i::RealPoint(16.6,0.0,0.0));
353  centerLine2.push_back(Z3i::RealPoint(20.0,0.0,0.0));
354  centerLine2.push_back(Z3i::RealPoint(60.0,0.0,0.0));
355  centerLine2.push_back(Z3i::RealPoint(63.3,0.0,0.0));
356  centerLine2.push_back(Z3i::RealPoint(66.6,0.0,0.0));
357  centerLine2.push_back(Z3i::RealPoint(70.0,0.0,0.0));
358  centerLine2.push_back(Z3i::RealPoint(71.7,0.1,0.0));
359  centerLine2.push_back(Z3i::RealPoint(73.4,0.6,0.0));
360  centerLine2.push_back(Z3i::RealPoint(75.0,1.3,0.0));
361  centerLine2.push_back(Z3i::RealPoint(76.4,2.3,0.0));
362  centerLine2.push_back(Z3i::RealPoint(77.6,3.5,0.0));
363  centerLine2.push_back(Z3i::RealPoint(78.6,5.0,0.0));
364  centerLine2.push_back(Z3i::RealPoint(79.3,6.5,0.0));
365  centerLine2.push_back(Z3i::RealPoint(79.8,8.2,0.0));
366  centerLine2.push_back(Z3i::RealPoint(80.0,10.0,0.0));
367  centerLine2.push_back(Z3i::RealPoint(80.0,13.8,0.0));
368  centerLine2.push_back(Z3i::RealPoint(80.0,86.1,0.0));
369  centerLine2.push_back(Z3i::RealPoint(80.0,90.0,0.0));
370  centerLine2.push_back(Z3i::RealPoint(80.1,91.7,-0.1));
371  centerLine2.push_back(Z3i::RealPoint(80.6,93.4,0.1));
372  centerLine2.push_back(Z3i::RealPoint(81.3,95.0,0.1));
373  centerLine2.push_back(Z3i::RealPoint(82.3,96.4,-0.1));
374  centerLine2.push_back(Z3i::RealPoint(83.5,97.6,-0.1));
375 
376  DGtal::Mesh<Z3i::RealPoint> theMeshTube(true);
378  5.0, 0.2, DGtal::Color::Blue);
379 
380  trace.info() << "Mesh generated with " << theMeshTube.nbFaces() << " faces (should be "
381  << (centerLine2.size()-1)*32 << " )" << std::endl;
382  nb++;
383  nbok += theMeshTube.nbFaces() == (centerLine2.size()-1)*32;
384 
385  theMeshTube >> "tubeGeneratedFromTestMesh.off";
386  trace.endBlock();
387 
388  return nb == nbok;
389 
390 }
void beginBlock(const std::string &keyword="")
Trace trace
Definition: Common.h:137
Aim: This class is defined to represent a surface mesh through a set of vertices and faces...
Definition: Mesh.h:91
double endBlock()
Aim: Implements basic operations that will be used in Point and Vector classes.
Definition: PointVector.h:141
static const Color Blue
Definition: Color.h:394
int max(int a, int b)
std::ostream & info()
static void createTubularMesh(Mesh< TPoint > &aMesh, const std::vector< TPoint > &aSkeleton, const double aRadius, const double angleStep=0.2, const DGtal::Color &aMeshColor=DGtal::Color::White)