#ifndef _SBASIS_GEOMETRIC #define _SBASIS_GEOMETRIC #include <2geom/d2.h> #include <2geom/piecewise.h> #include /** * \file * \brief two-dimensional geometric operators. * * Copyright 2007, JFBarraud * Copyright 2007, njh * * These operators are built on a more 'polynomially robust' * transformation to map a function that takes a [0,1] parameter to a * 2d vector into a function that takes the same [0,1] parameter to a * unit vector with the same direction. * * Rather that using (X/sqrt(X))(t) which involves two unstable * operations, sqrt and divide, this approach forms a curve directly * from the various tangent directions at each end (angular jet). As * a result, the final path has a convergence behaviour derived from * that of the sin and cos series. -- njh */ namespace Geom{ Piecewise > cutAtRoots(Piecewise > const &M, double tol=1e-4); Piecewise atan2(D2 const &vect, double tol=.01, unsigned order=3); Piecewise atan2(Piecewise >const &vect, double tol=.01, unsigned order=3); D2 > tan2(SBasis const &angle, double tol=.01, unsigned order=3); D2 > tan2(Piecewise const &angle, double tol=.01, unsigned order=3); Piecewise > unitVector(D2 const &vect, double tol=.01, unsigned order=3); Piecewise > unitVector(Piecewise > const &vect, double tol=.01, unsigned order=3); // Piecewise > // uniform_speed(D2 const M, // double tol=.1); Piecewise curvature( D2 const &M, double tol=.01); Piecewise curvature(Piecewise > const &M, double tol=.01); Piecewise arcLengthSb( D2 const &M, double tol=.01); Piecewise arcLengthSb(Piecewise > const &M, double tol=.01); double length( D2 const &M, double tol=.01); double length(Piecewise > const &M, double tol=.01); void length_integrating(D2 const &B, double &result, double &abs_error, double tol); Piecewise > arc_length_parametrization(D2 const &M, unsigned order=3, double tol=.01); Piecewise > arc_length_parametrization(Piecewise > const &M, unsigned order=3, double tol=.01); unsigned centroid(Piecewise > const &p, Point& centroid, double &area); std::vector > cubics_fitting_curvature(Point const &M0, Point const &M1, Point const &dM0, Point const &dM1, double d2M0xdM0, double d2M1xdM1, int insist_on_speed_signs = 1, double epsilon = 1e-5); std::vector > cubics_fitting_curvature(Point const &M0, Point const &M1, Point const &dM0, Point const &dM1, Point const &d2M0, Point const &d2M1, int insist_on_speed_signs = 1, double epsilon = 1e-5); std::vector > cubics_with_prescribed_curvature(Point const &M0, Point const &M1, Point const &dM0, Point const &dM1, double k0, double k1, int insist_on_speed_signs = 1, double error = 1e-5); std::vector find_tangents(Point P, D2 const &A); }; #endif /* Local Variables: mode:c++ c-file-style:"stroustrup" c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) indent-tabs-mode:nil fill-column:99 End: */ // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :