summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohan B. C. Engelen <jbc.engelen@swissonline.ch>2012-04-13 21:42:28 +0000
committerJohan B. C. Engelen <j.b.c.engelen@alumnus.utwente.nl>2012-04-13 21:42:28 +0000
commitb307246cda3ad55e4a00b596de964a492196c0fa (patch)
tree505c74b5a5635f539a0d971c7b417a77af211dd2
parentprobably this was intended (diff)
downloadinkscape-b307246cda3ad55e4a00b596de964a492196c0fa.tar.gz
inkscape-b307246cda3ad55e4a00b596de964a492196c0fa.zip
small 2geom update
(bzr r11239)
-rw-r--r--src/2geom/d2-sbasis.cpp13
-rw-r--r--src/2geom/d2-sbasis.h5
-rw-r--r--src/live_effects/lpe-powerstroke.cpp15
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,