DGtalTools 2.1.0
Loading...
Searching...
No Matches
3dParametricCurveDigitizer.cpp
1
30#include <iostream>
31#include <vector>
32#include <string>
33#include <iterator>
34
35#include "CLI11.hpp"
36
37#include "DGtal/base/Common.h"
38#include "DGtal/helpers/StdDefs.h"
39#include "DGtal/kernel/BasicPointFunctors.h"
40
41#include "DGtal/geometry/curves/parametric/EllipticHelix.h"
42#include "DGtal/geometry/curves/parametric/Knot_3_1.h"
43#include "DGtal/geometry/curves/parametric/Knot_3_2.h"
44#include "DGtal/geometry/curves/parametric/Knot_4_1.h"
45#include "DGtal/geometry/curves/parametric/Knot_4_3.h"
46#include "DGtal/geometry/curves/parametric/Knot_5_1.h"
47#include "DGtal/geometry/curves/parametric/Knot_5_2.h"
48#include "DGtal/geometry/curves/parametric/Knot_6_2.h"
49#include "DGtal/geometry/curves/parametric/Knot_7_4.h"
50#include "DGtal/geometry/curves/parametric/NaiveParametricCurveDigitizer3D.h"
51#include "DGtal/geometry/curves/parametric/DecoratorParametricCurveTransformation.h"
52#include "DGtal/images/RigidTransformation3D.h"
53
54using namespace DGtal;
55
56
128std::vector<std::string> curves3D;
129std::vector<std::string> curvesDesc;
130
135void createList()
136{
137 curves3D.push_back("EllipticHelix");
138 curvesDesc.push_back("A helix with two axes.");
139
140 curves3D.push_back("Knot_3_1");
141 curvesDesc.push_back("A parametric polynomial knot.");
142
143 curves3D.push_back("Knot_3_2");
144 curvesDesc.push_back("A parametric knot having period 2 * Pi.");
145
146 curves3D.push_back("Knot_4_1");
147 curvesDesc.push_back("A parametric polynomial knot.");
148
149 curves3D.push_back("Knot_4_3");
150 curvesDesc.push_back("A parametric knot having period 2 * Pi.");
151
152 curves3D.push_back("Knot_5_1");
153 curvesDesc.push_back("A parametric polynomial knot.");
154
155 curves3D.push_back("Knot_5_2");
156 curvesDesc.push_back("A parametric knot having period 2 * Pi.");
157
158 curves3D.push_back("Knot_6_2");
159 curvesDesc.push_back("A parametric polynomial knot.");
160
161 curves3D.push_back("Knot_7_4");
162 curvesDesc.push_back("A parametric polynomial knot.");
163}
164
169void displayList()
170{
171 trace.emphase()<<"3D Curves:"<<std::endl;
172 for ( unsigned int i = 0; i < curves3D.size(); ++i )
173 trace.info()<<"\t"<<curves3D[i]<<"\t" <<curvesDesc[i]<<std::endl;
174}
175
176
185unsigned int checkAndRetrunIndex(const std::string &curveName)
186{
187 unsigned int pos = 0;
188
189 while ((pos < curves3D.size()) && (curves3D[pos] != curveName))
190 pos++;
191
192 if ( pos == curves3D.size ( ) )
193 {
194 trace.error ( ) << "The specified shape has not found.";
195 trace.info ( ) << std::endl;
196 exit ( 1 );
197 }
198
199 return pos;
200}
201
202
210template <typename Iterator>
211struct Exporter
212{
213
222 static
223 void save ( Iterator begin, Iterator end, const std::string outputName )
224 {
225 std::ofstream outfile;
226 outfile.open ( outputName + ".dat", std::ofstream::out );
227 for ( auto it = begin; it != end; ++it )
228 outfile << (*it)[0] << " " << (*it)[1] << " " << (*it)[2] << std::endl;
229 }
230};
231
237void missingParam(std::string param)
238{
239 trace.error() <<" Parameter: "<<param<<" is required..";
240 trace.info()<<std::endl;
241 exit(1);
242}
243
245
246int main( int argc, char** argv )
247{
248 // parse command line CLI ----------------------------------------------
249 CLI::App app;
250 std::string curveName;
251 std::string outputName;
252 double param1 {1};
253 double param2 {1};
254 double param3 {1};
255 double tstart;
256 double tend;
257 double step;
258 unsigned int knext {5};
259 double angle;
260 double ox {0}, oy {0}, oz {0};
261 double ax {1}, ay {0}, az {0};
262
263 app.description("Digitizes 3D parametric curves using DGtal library.\n Typical use example:\n \t 3dParametricCurveDigitizer [options] --curve <curve> --param1 <double> --param2 <double> --param3 <double> --tstart <double> --tend <double> --step <double> --output <basename>\n");
264 app.add_option("--param1",param1,"a radius or a scaling factor (default 0)");
265 app.add_option("--param2",param2,"a radius or a scaling factor (default 0)");
266 app.add_option("--param3",param3,"a radius or a scaling factor (default 0)");
267 auto tstartOpt = app.add_option("--tstart",tstart,"start time");
268 auto tendOpt = app.add_option("--tend",tend,"end time");
269 auto stepOpt = app.add_option("--step, -s",step,"step");
270 app.add_option("--knext, -k",knext,"K_NEXT value (default 5)");
271 auto listOpt = app.add_flag("--list,-l","List all available shapes");
272 auto curveNameOpt = app.add_option("--curve,-c",curveName,"Shape name");
273 app.add_option("--angle,-a",angle,"Rotation angle in radians(default 0)");
274 app.add_option("--ox",ox,"X coordinate of origin (default 0)");
275 app.add_option("--oy",oy,"Y coordinate of origin (default 0)");
276 app.add_option("--oz",oz,"Z coordinate of origin (default 0)");
277 app.add_option("--ax",ax,"X component of rotation axis (default 1)");
278 app.add_option("--ay",ay,"Y component of rotation axis (default 0)");
279 app.add_option("--az",az,"Z component of rotation axis (default 0)");
280 auto outputNameOpt = app.add_option("--output,-o",outputName,"Basename of the output file");
281
282 app.get_formatter()->column_width(40);
283 CLI11_PARSE(app, argc, argv);
284 // END parse command line using CLI ----------------------------------------------
285
286 //List creation
287 createList();
288
289 if ( listOpt->count() > 0 )
290 {
291 displayList();
292 return 0;
293 }
294
295 if ( curveNameOpt->count() == 0) missingParam("--curve");
296 if ( outputNameOpt->count() == 0) missingParam("--output");
297 if ( tstartOpt->count() == 0) missingParam("--tstart");
298 if ( tendOpt->count() == 0) missingParam("--tend");
299 if ( stepOpt->count() == 0) missingParam("--step");
300
301 typedef functors::ForwardRigidTransformation3D < Z3i::Space, Z3i::RealPoint, Z3i::RealPoint, functors::Identity > ForwardTrans;
302 ForwardTrans trans ( Z3i::RealPoint ( ox, oy, oz ), Z3i::RealPoint ( ax, ay, az ), angle, Z3i::RealVector ( 0, 0, 0 ) );
303 //We check that the shape is known
304 unsigned int id = checkAndRetrunIndex ( curveName );
305
306 if ( id == 0 )
307 {
308 typedef EllipticHelix < Z3i::Space > MyHelix;
309 typedef DecoratorParametricCurveTransformation < MyHelix, ForwardTrans > MyRotatedCurve;
310 typedef NaiveParametricCurveDigitizer3D < MyRotatedCurve > Digitizer;
311 typedef typename NaiveParametricCurveDigitizer3D < MyRotatedCurve >::DigitalCurve MyDigitalCurve;
312 typedef NaiveParametricCurveDigitizer3D < MyRotatedCurve >::MetaData MyMetaData;
313
314 MyDigitalCurve digitalCurve;
315 MyHelix helix ( param1, param2, param3 );
316 MyRotatedCurve rotCurve ( helix, trans );
317 Digitizer digitize;
318 digitize.init ( tstart, tend, step );
319 digitize.setKNext ( knext );
320 digitize.attach ( &rotCurve );
321 digitize.digitize ( std::back_insert_iterator < MyDigitalCurve> ( digitalCurve ) );
322 Exporter < MyDigitalCurve::const_iterator >::save ( digitalCurve.begin ( ), digitalCurve.end ( ), outputName );
323 }
324
325 if ( id == 1 )
326 {
327 typedef Knot_3_1 < Z3i::Space > MyKnot;
328 typedef DecoratorParametricCurveTransformation < MyKnot, ForwardTrans > MyRotatedCurve;
329 typedef NaiveParametricCurveDigitizer3D < MyRotatedCurve > Digitizer;
330 typedef NaiveParametricCurveDigitizer3D < MyRotatedCurve >::DigitalCurve MyDigitalCurve;
331 typedef NaiveParametricCurveDigitizer3D < MyRotatedCurve >::MetaData MyMetaData;
332
333 MyDigitalCurve digitalCurve;
334 MyKnot knot ( param1, param2, param3 );
335 MyRotatedCurve rotCurve ( knot, trans );
336 Digitizer digitize;
337 digitize.init ( tstart, tend, step );
338 digitize.setKNext ( knext );
339 digitize.attach ( &rotCurve );
340 digitize.digitize ( std::back_insert_iterator < MyDigitalCurve> ( digitalCurve ) );
341 Exporter < MyDigitalCurve::const_iterator >::save ( digitalCurve.begin ( ), digitalCurve.end ( ), outputName );
342 }
343
344 if ( id == 2 )
345 {
346 typedef Knot_3_2 < Z3i::Space > MyKnot;
347 typedef DecoratorParametricCurveTransformation < MyKnot, ForwardTrans > MyRotatedCurve;
348 typedef NaiveParametricCurveDigitizer3D < MyRotatedCurve > Digitizer;
349 typedef NaiveParametricCurveDigitizer3D < MyRotatedCurve >::DigitalCurve MyDigitalCurve;
350 typedef NaiveParametricCurveDigitizer3D < MyRotatedCurve >::MetaData MyMetaData;
351
352 MyDigitalCurve digitalCurve;
353 MyKnot knot ( param1, param2, param3 );
354 MyRotatedCurve rotCurve ( knot, trans );
355 Digitizer digitize;
356 digitize.init ( tstart, tend, step );
357 digitize.setKNext ( knext );
358 digitize.attach ( &rotCurve );
359 digitize.digitize ( std::back_insert_iterator < MyDigitalCurve> ( digitalCurve ) );
360 Exporter < MyDigitalCurve::const_iterator >::save ( digitalCurve.begin ( ), digitalCurve.end ( ), outputName );
361 }
362
363 if ( id == 3 )
364 {
365 typedef Knot_4_1 < Z3i::Space > MyKnot;
366 typedef DecoratorParametricCurveTransformation < MyKnot, ForwardTrans > MyRotatedCurve;
367 typedef NaiveParametricCurveDigitizer3D < MyRotatedCurve > Digitizer;
368 typedef NaiveParametricCurveDigitizer3D < MyRotatedCurve >::DigitalCurve MyDigitalCurve;
369 typedef NaiveParametricCurveDigitizer3D < MyRotatedCurve >::MetaData MyMetaData;
370
371 MyDigitalCurve digitalCurve;
372 MyKnot knot ( param1, param2, param3 );
373 MyRotatedCurve rotCurve ( knot, trans );
374 Digitizer digitize;
375 digitize.init ( tstart, tend, step );
376 digitize.setKNext ( knext );
377 digitize.attach ( &rotCurve );
378 digitize.digitize ( std::back_insert_iterator < MyDigitalCurve> ( digitalCurve ) );
379 Exporter < MyDigitalCurve::const_iterator >::save ( digitalCurve.begin ( ), digitalCurve.end ( ), outputName );
380 }
381
382 if ( id == 4 )
383 {
384 typedef Knot_4_3 < Z3i::Space > MyKnot;
385 typedef DecoratorParametricCurveTransformation < MyKnot, ForwardTrans > MyRotatedCurve;
386 typedef NaiveParametricCurveDigitizer3D < MyRotatedCurve > Digitizer;
387 typedef NaiveParametricCurveDigitizer3D < MyRotatedCurve >::DigitalCurve MyDigitalCurve;
388 typedef NaiveParametricCurveDigitizer3D < MyRotatedCurve >::MetaData MyMetaData;
389
390 MyDigitalCurve digitalCurve;
391 MyKnot knot ( param1, param2, param3 );
392 MyRotatedCurve rotCurve ( knot, trans );
393 Digitizer digitize;
394 digitize.init ( tstart, tend, step );
395 digitize.setKNext ( knext );
396 digitize.attach ( &rotCurve );
397 digitize.digitize ( std::back_insert_iterator < MyDigitalCurve> ( digitalCurve ) );
398 Exporter < MyDigitalCurve::const_iterator >::save ( digitalCurve.begin ( ), digitalCurve.end ( ), outputName );
399 }
400
401 if ( id == 5 )
402 {
403 typedef Knot_5_1 < Z3i::Space > MyKnot;
404 typedef DecoratorParametricCurveTransformation < MyKnot, ForwardTrans > MyRotatedCurve;
405 typedef NaiveParametricCurveDigitizer3D < MyRotatedCurve > Digitizer;
406 typedef NaiveParametricCurveDigitizer3D < MyRotatedCurve >::DigitalCurve MyDigitalCurve;
407 typedef NaiveParametricCurveDigitizer3D < MyRotatedCurve >::MetaData MyMetaData;
408
409 MyDigitalCurve digitalCurve;
410 MyKnot knot ( param1, param2, param3 );
411 MyRotatedCurve rotCurve ( knot, trans );
412 Digitizer digitize;
413 digitize.init ( tstart, tend, step );
414 digitize.setKNext ( knext );
415 digitize.attach ( &rotCurve );
416 digitize.digitize ( std::back_insert_iterator < MyDigitalCurve> ( digitalCurve ) );
417 Exporter < MyDigitalCurve::const_iterator >::save ( digitalCurve.begin ( ), digitalCurve.end ( ), outputName );
418 }
419
420 if ( id == 6 )
421 {
422 typedef Knot_5_2 < Z3i::Space > MyKnot;
423 typedef DecoratorParametricCurveTransformation < MyKnot, ForwardTrans > MyRotatedCurve;
424 typedef NaiveParametricCurveDigitizer3D < MyRotatedCurve > Digitizer;
425 typedef NaiveParametricCurveDigitizer3D < MyRotatedCurve >::DigitalCurve MyDigitalCurve;
426 typedef NaiveParametricCurveDigitizer3D < MyRotatedCurve >::MetaData MyMetaData;
427
428 MyDigitalCurve digitalCurve;
429 MyKnot knot ( param1, param2, param3 );
430 MyRotatedCurve rotCurve ( knot, trans );
431 Digitizer digitize;
432 digitize.init ( tstart, tend, step );
433 digitize.setKNext ( knext );
434 digitize.attach ( &rotCurve );
435 digitize.digitize ( std::back_insert_iterator < MyDigitalCurve> ( digitalCurve ) );
436 Exporter < MyDigitalCurve::const_iterator >::save ( digitalCurve.begin ( ), digitalCurve.end ( ), outputName );
437 }
438
439 if ( id == 7 )
440 {
441 typedef Knot_6_2 < Z3i::Space > MyKnot;
442 typedef DecoratorParametricCurveTransformation < MyKnot, ForwardTrans > MyRotatedCurve;
443 typedef NaiveParametricCurveDigitizer3D < MyRotatedCurve > Digitizer;
444 typedef NaiveParametricCurveDigitizer3D < MyRotatedCurve >::DigitalCurve MyDigitalCurve;
445 typedef NaiveParametricCurveDigitizer3D < MyRotatedCurve >::MetaData MyMetaData;
446
447 MyDigitalCurve digitalCurve;
448 MyKnot knot ( param1, param2, param3 );
449 MyRotatedCurve rotCurve ( knot, trans );
450 Digitizer digitize;
451 digitize.init ( tstart, tend, step );
452 digitize.setKNext ( knext );
453 digitize.attach ( &rotCurve );
454 digitize.digitize ( std::back_insert_iterator < MyDigitalCurve> ( digitalCurve ) );
455 Exporter < MyDigitalCurve::const_iterator >::save ( digitalCurve.begin ( ), digitalCurve.end ( ), outputName );
456 }
457
458 if ( id == 8 )
459 {
460 typedef Knot_7_4 < Z3i::Space > MyKnot;
461 typedef DecoratorParametricCurveTransformation < MyKnot, ForwardTrans > MyRotatedCurve;
462 typedef NaiveParametricCurveDigitizer3D < MyRotatedCurve > Digitizer;
463 typedef NaiveParametricCurveDigitizer3D < MyRotatedCurve >::DigitalCurve MyDigitalCurve;
464 typedef NaiveParametricCurveDigitizer3D < MyRotatedCurve >::MetaData MyMetaData;
465
466 MyDigitalCurve digitalCurve;
467 MyKnot knot ( param1, param2, param3 );
468 MyRotatedCurve rotCurve ( knot, trans );
469 Digitizer digitize;
470 digitize.init ( tstart, tend, step );
471 digitize.setKNext ( knext );
472 digitize.attach ( &rotCurve );
473 digitize.digitize ( std::back_insert_iterator < MyDigitalCurve> ( digitalCurve ) );
474 Exporter < MyDigitalCurve::const_iterator >::save ( digitalCurve.begin ( ), digitalCurve.end ( ), outputName );
475 }
476
477 return 0;
478}
Definition ATu0v1.h:57