diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/2geom/d2-sbasis.cpp | 13 | ||||
| -rw-r--r-- | src/2geom/d2-sbasis.h | 5 | ||||
| -rw-r--r-- | src/live_effects/lpe-powerstroke.cpp | 15 |
3 files changed, 18 insertions, 15 deletions
diff --git a/src/2geom/d2-sbasis.cpp b/src/2geom/d2-sbasis.cpp index 7bfb7c6c5..486ada9a2 100644 --- a/src/2geom/d2-sbasis.cpp +++ b/src/2geom/d2-sbasis.cpp @@ -185,6 +185,19 @@ split_at_discontinuities (Geom::Piecewise<Geom::D2<Geom::SBasis> > const & pwsbi return ret; } +Point unitTangentAt(D2<SBasis> const & a, Coord t, unsigned n) +{ + std::vector<Point> derivs = a.valueAndDerivatives(t, n); + for (unsigned deriv_n = 1; deriv_n < derivs.size(); deriv_n++) { + Coord length = derivs[deriv_n].length(); + if ( ! are_near(length, 0) ) { + // length of derivative is non-zero, so return unit vector + return derivs[deriv_n] / length; + } + } + return Point (0,0); +} + static void set_first_point(Piecewise<D2<SBasis> > &f, Point a){ if ( f.empty() ){ f.concat(Piecewise<D2<SBasis> >(D2<SBasis>(Linear(a[X]),Linear(a[Y])))); diff --git a/src/2geom/d2-sbasis.h b/src/2geom/d2-sbasis.h index e61067e1b..965ec8746 100644 --- a/src/2geom/d2-sbasis.h +++ b/src/2geom/d2-sbasis.h @@ -83,6 +83,11 @@ std::vector<Piecewise<D2<SBasis> > > fuse_nearby_ends(std::vector<Piecewise<D2<S std::vector<Geom::Piecewise<Geom::D2<Geom::SBasis> > > split_at_discontinuities (Geom::Piecewise<Geom::D2<Geom::SBasis> > const & pwsbin, double tol = .0001); +/** +* note that -unitTangentAt(reverse(a),0.) == unitTangentAt(a,1.) but the former is more reliable (sometimes the sign is wrong for the latter) +*/ +Point unitTangentAt(D2<SBasis> const & a, Coord t, unsigned n = 3); + class CoordIterator : public std::iterator<std::input_iterator_tag, SBasis const> { diff --git a/src/live_effects/lpe-powerstroke.cpp b/src/live_effects/lpe-powerstroke.cpp index 79997ff94..281376cde 100644 --- a/src/live_effects/lpe-powerstroke.cpp +++ b/src/live_effects/lpe-powerstroke.cpp @@ -34,21 +34,6 @@ namespace Geom { // should all be moved to 2geom at some point -/** -* note that -unitTangentAt(reverse(a),0.) == unitTangentAt(a,1.) but the former is more reliable (sometimes the sign is wrong for the latter) -*/ -Point unitTangentAt( D2<SBasis> const & a, Coord t, unsigned n = 3) { - std::vector<Point> derivs = a.valueAndDerivatives(t, n); - for (unsigned deriv_n = 1; deriv_n < derivs.size(); deriv_n++) { - Coord length = derivs[deriv_n].length(); - if ( ! are_near(length, 0) ) { - // length of derivative is non-zero, so return unit vector - return derivs[deriv_n] / length; - } - } - return Point (0,0); -} - /** Find the point where two straight lines cross. */ boost::optional<Point> intersection_point( Point const & origin_a, Point const & vector_a, |
