diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/2geom/d2-sbasis.cpp | 27 | ||||
| -rw-r--r-- | src/2geom/d2-sbasis.h | 6 |
2 files changed, 27 insertions, 6 deletions
diff --git a/src/2geom/d2-sbasis.cpp b/src/2geom/d2-sbasis.cpp index a646e2cf4..dbf4da10e 100644 --- a/src/2geom/d2-sbasis.cpp +++ b/src/2geom/d2-sbasis.cpp @@ -97,9 +97,8 @@ Piecewise<D2<SBasis> > operator*(Piecewise<D2<SBasis> > const &a, Matrix const & } //if tol>0, only force continuity where the jump is smaller than tol. -Piecewise<D2<SBasis> > force_continuity(Piecewise<D2<SBasis> > const &f, - double tol, - bool closed){ +Piecewise<D2<SBasis> > force_continuity(Piecewise<D2<SBasis> > const &f, double tol, bool closed) +{ if (f.size()==0) return f; Piecewise<D2<SBasis> > result=f; unsigned cur = (closed)? 0:1; @@ -129,4 +128,26 @@ Piecewise<D2<SBasis> > force_continuity(Piecewise<D2<SBasis> > const &f, } return result; } + +std::vector<Geom::Piecewise<Geom::D2<Geom::SBasis> > > +split_at_discontinuities (Geom::Piecewise<Geom::D2<Geom::SBasis> > const & pwsbin, double tol) +{ + using namespace Geom; + std::vector<Piecewise<D2<SBasis> > > ret; + unsigned piece_start = 0; + for (unsigned i=0; i<pwsbin.segs.size(); i++){ + if (i==(pwsbin.segs.size()-1) || L2(pwsbin.segs[i].at1()- pwsbin.segs[i+1].at0()) > tol){ + Piecewise<D2<SBasis> > piece; + piece.cuts.push_back(pwsbin.cuts[piece_start]); + for (unsigned j = piece_start; j<i+1; j++){ + piece.segs.push_back(pwsbin.segs[j]); + piece.cuts.push_back(pwsbin.cuts[j+1]); + } + ret.push_back(piece); + piece_start = i+1; + } + } + return ret; } + +} // namespace Geom diff --git a/src/2geom/d2-sbasis.h b/src/2geom/d2-sbasis.h index 95f1ca0dd..c1f0faf4d 100644 --- a/src/2geom/d2-sbasis.h +++ b/src/2geom/d2-sbasis.h @@ -39,9 +39,9 @@ Piecewise<SBasis> cross(Piecewise<D2<SBasis> > const &a, Piecewise<D2<SBasis> > Piecewise<D2<SBasis> > operator*(Piecewise<D2<SBasis> > const &a, Matrix const &m); -Piecewise<D2<SBasis> > force_continuity(Piecewise<D2<SBasis> > const &f, - double tol=0, - bool closed=false); +Piecewise<D2<SBasis> > force_continuity(Piecewise<D2<SBasis> > const &f, double tol=0, bool closed=false); + +std::vector<Geom::Piecewise<Geom::D2<Geom::SBasis> > > split_at_discontinuities (Geom::Piecewise<Geom::D2<Geom::SBasis> > const & pwsbin, double tol = .0001); class CoordIterator : public std::iterator<std::input_iterator_tag, SBasis const> |
