37#include "DGtal/base/Common.h"
38#include "DGtal/helpers/StdDefs.h"
39#include "DGtal/kernel/BasicPointFunctors.h"
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"
128std::vector<std::string> curves3D;
129std::vector<std::string> curvesDesc;
137 curves3D.push_back(
"EllipticHelix");
138 curvesDesc.push_back(
"A helix with two axes.");
140 curves3D.push_back(
"Knot_3_1");
141 curvesDesc.push_back(
"A parametric polynomial knot.");
143 curves3D.push_back(
"Knot_3_2");
144 curvesDesc.push_back(
"A parametric knot having period 2 * Pi.");
146 curves3D.push_back(
"Knot_4_1");
147 curvesDesc.push_back(
"A parametric polynomial knot.");
149 curves3D.push_back(
"Knot_4_3");
150 curvesDesc.push_back(
"A parametric knot having period 2 * Pi.");
152 curves3D.push_back(
"Knot_5_1");
153 curvesDesc.push_back(
"A parametric polynomial knot.");
155 curves3D.push_back(
"Knot_5_2");
156 curvesDesc.push_back(
"A parametric knot having period 2 * Pi.");
158 curves3D.push_back(
"Knot_6_2");
159 curvesDesc.push_back(
"A parametric polynomial knot.");
161 curves3D.push_back(
"Knot_7_4");
162 curvesDesc.push_back(
"A parametric polynomial knot.");
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;
185unsigned int checkAndRetrunIndex(
const std::string &curveName)
187 unsigned int pos = 0;
189 while ((pos < curves3D.size()) && (curves3D[pos] != curveName))
192 if ( pos == curves3D.size ( ) )
194 trace.error ( ) <<
"The specified shape has not found.";
195 trace.info ( ) << std::endl;
210template <
typename Iterator>
223 void save ( Iterator begin, Iterator end,
const std::string outputName )
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;
237void missingParam(std::string param)
239 trace.error() <<
" Parameter: "<<param<<
" is required..";
240 trace.info()<<std::endl;
246int main(
int argc,
char** argv )
250 std::string curveName;
251 std::string outputName;
258 unsigned int knext {5};
260 double ox {0}, oy {0}, oz {0};
261 double ax {1}, ay {0}, az {0};
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");
282 app.get_formatter()->column_width(40);
283 CLI11_PARSE(app, argc, argv);
289 if ( listOpt->count() > 0 )
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");
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 ) );
304 unsigned int id = checkAndRetrunIndex ( curveName );
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;
314 MyDigitalCurve digitalCurve;
315 MyHelix helix ( param1, param2, param3 );
316 MyRotatedCurve rotCurve ( helix, trans );
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 );
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;
333 MyDigitalCurve digitalCurve;
334 MyKnot knot ( param1, param2, param3 );
335 MyRotatedCurve rotCurve ( knot, trans );
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 );
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;
352 MyDigitalCurve digitalCurve;
353 MyKnot knot ( param1, param2, param3 );
354 MyRotatedCurve rotCurve ( knot, trans );
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 );
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;
371 MyDigitalCurve digitalCurve;
372 MyKnot knot ( param1, param2, param3 );
373 MyRotatedCurve rotCurve ( knot, trans );
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 );
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;
390 MyDigitalCurve digitalCurve;
391 MyKnot knot ( param1, param2, param3 );
392 MyRotatedCurve rotCurve ( knot, trans );
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 );
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;
409 MyDigitalCurve digitalCurve;
410 MyKnot knot ( param1, param2, param3 );
411 MyRotatedCurve rotCurve ( knot, trans );
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 );
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;
428 MyDigitalCurve digitalCurve;
429 MyKnot knot ( param1, param2, param3 );
430 MyRotatedCurve rotCurve ( knot, trans );
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 );
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;
447 MyDigitalCurve digitalCurve;
448 MyKnot knot ( param1, param2, param3 );
449 MyRotatedCurve rotCurve ( knot, trans );
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 );
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;
466 MyDigitalCurve digitalCurve;
467 MyKnot knot ( param1, param2, param3 );
468 MyRotatedCurve rotCurve ( knot, trans );
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 );