mirror of
https://github.com/scratchfoundation/paper.js.git
synced 2025-01-07 13:22:07 -05:00
Implement Douglas–Peucker algorithm for point reduction before the curve fitting.
This commit is contained in:
parent
aef8dcf2d3
commit
42f5b5e26e
1 changed files with 23 additions and 0 deletions
|
@ -31,6 +31,7 @@ var PathFitter = Base.extend({
|
||||||
prev = point;
|
prev = point;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this.points = this.reducePoints(this.points, 1);
|
||||||
this.error = error;
|
this.error = error;
|
||||||
this.iterationError = error * error;
|
this.iterationError = error * error;
|
||||||
},
|
},
|
||||||
|
@ -46,6 +47,28 @@ var PathFitter = Base.extend({
|
||||||
return this.segments;
|
return this.segments;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Douglas–Peucker algorithm
|
||||||
|
reducePoints: function(points, tolerance) {
|
||||||
|
var line = new Line(points[0], points[points.length - 1], false);
|
||||||
|
var maxDistance = 0,
|
||||||
|
maxIndex = 0;
|
||||||
|
for (var i = 1; i < points.length - 1; i++) {
|
||||||
|
var distance = line.getDistance(points[i]);
|
||||||
|
if(distance > maxDistance) {
|
||||||
|
maxDistance = distance;
|
||||||
|
maxIndex = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (maxDistance >= tolerance) {
|
||||||
|
var pts = this.reducePoints(
|
||||||
|
points.slice(0, maxIndex + 1), tolerance);
|
||||||
|
pts.pop();
|
||||||
|
return pts.concat(this.reducePoints(
|
||||||
|
points.slice(maxIndex, points.length), tolerance));
|
||||||
|
}
|
||||||
|
return [points[0], points[points.length - 1]];
|
||||||
|
},
|
||||||
|
|
||||||
// Fit a Bezier curve to a (sub)set of digitized points
|
// Fit a Bezier curve to a (sub)set of digitized points
|
||||||
fitCubic: function(first, last, tHat1, tHat2) {
|
fitCubic: function(first, last, tHat1, tHat2) {
|
||||||
// Use heuristic if region only has two points in it
|
// Use heuristic if region only has two points in it
|
||||||
|
|
Loading…
Reference in a new issue