diff options
| author | JF Barraud <jf.barraud@gmail.com> | 2008-03-08 21:59:59 +0000 |
|---|---|---|
| committer | jfbarraud <jfbarraud@users.sourceforge.net> | 2008-03-08 21:59:59 +0000 |
| commit | 001cdbc5a8694b524c84e34d17c3f8296b1a5943 (patch) | |
| tree | 7d0c480536b2ca9fb6ace76e339847da3ce67d72 /src | |
| parent | Fixed ctor intialization order (diff) | |
| download | inkscape-001cdbc5a8694b524c84e34d17c3f8296b1a5943.tar.gz inkscape-001cdbc5a8694b524c84e34d17c3f8296b1a5943.zip | |
2Geom fix: derivative of order 1 bezier, and an out of range bug affecting intersection computation.
(bzr r5000)
Diffstat (limited to 'src')
| -rw-r--r-- | src/2geom/bezier.h | 6 | ||||
| -rw-r--r-- | src/2geom/path.h | 6 | ||||
| -rw-r--r-- | src/2geom/sweep.cpp | 1 |
3 files changed, 6 insertions, 7 deletions
diff --git a/src/2geom/bezier.h b/src/2geom/bezier.h index bdc672a57..af6df0840 100644 --- a/src/2geom/bezier.h +++ b/src/2geom/bezier.h @@ -173,7 +173,8 @@ public: Coord d_[order()+1]; unsigned nn = n_derivs; if(nn > order()) - nn = order(); + //nn = order(); + nn = order()+1; for(unsigned i = 0; i < size(); i++) d_[i] = c_[i]; for(unsigned di = 0; di < nn; di++) { @@ -262,7 +263,8 @@ inline std::vector<Point> bezier_points(const D2<Bezier > & a) { } inline Bezier derivative(const Bezier & a) { - if(a.order() == 1) return Bezier(0.0); + //if(a.order() == 1) return Bezier(0.0); + if(a.order() == 1) return Bezier(a.c_[1]-a.c_[0]); Bezier der(Bezier::Order(a.order()-1)); for(unsigned i = 0; i < a.order(); i++) { diff --git a/src/2geom/path.h b/src/2geom/path.h index 72c5d50fa..f314e6efa 100644 --- a/src/2geom/path.h +++ b/src/2geom/path.h @@ -236,11 +236,7 @@ public: return new BezierCurve<order-1>(Geom::derivative(inner[X]), Geom::derivative(inner[Y])); else if (order == 1) { double dx = inner[X][1] - inner[X][0], dy = inner[Y][1] - inner[Y][0]; - if(dx == 0) return new BezierCurve<1>(Point(0,0), Point(0,0)); - double slope = dy / dx; - Geom::Point pnt; - if(slope == 0) pnt = Geom::Point(0, 0); else pnt = Geom::Point(slope, 1./slope); - return new BezierCurve<1>(pnt, pnt); + return new BezierCurve<1>(Point(dx,dy),Point(dx,dy)); } } diff --git a/src/2geom/sweep.cpp b/src/2geom/sweep.cpp index 08674ab2f..b9ef71b5c 100644 --- a/src/2geom/sweep.cpp +++ b/src/2geom/sweep.cpp @@ -82,6 +82,7 @@ std::vector<std::vector<unsigned> > sweep_bounds(std::vector<Rect> a, std::vecto open[n].push_back(ix); } i[n]++; + if(i[n]>=events[n].size()) {break;} n = (events[!n][i[!n]] < events[n][i[n]]) ? !n : n; } return pairs; |
