summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJF Barraud <jf.barraud@gmail.com>2008-03-08 21:59:59 +0000
committerjfbarraud <jfbarraud@users.sourceforge.net>2008-03-08 21:59:59 +0000
commit001cdbc5a8694b524c84e34d17c3f8296b1a5943 (patch)
tree7d0c480536b2ca9fb6ace76e339847da3ce67d72 /src
parentFixed ctor intialization order (diff)
downloadinkscape-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.h6
-rw-r--r--src/2geom/path.h6
-rw-r--r--src/2geom/sweep.cpp1
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;