mirror of
https://github.com/scratchfoundation/paper.js.git
synced 2025-01-08 05:42:07 -05:00
Start implementing CurveFlattener, as required for dashing.
This commit is contained in:
parent
bff3e14155
commit
ce01d2cc59
2 changed files with 51 additions and 0 deletions
|
@ -50,6 +50,7 @@ var sources = [
|
||||||
'src/path/SegmentPoint.js',
|
'src/path/SegmentPoint.js',
|
||||||
'src/path/SelectionState.js',
|
'src/path/SelectionState.js',
|
||||||
'src/path/Curve.js',
|
'src/path/Curve.js',
|
||||||
|
'src/path/CurveFlattener.js',
|
||||||
'src/path/CurveLocation.js',
|
'src/path/CurveLocation.js',
|
||||||
'src/path/PathItem.js',
|
'src/path/PathItem.js',
|
||||||
'src/path/Path.js',
|
'src/path/Path.js',
|
||||||
|
|
50
src/path/CurveFlattener.js
Normal file
50
src/path/CurveFlattener.js
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
var CurveFlattener = Base.extend({
|
||||||
|
initialize: function(curve) {
|
||||||
|
this.curve = curve;
|
||||||
|
this.segments = [];
|
||||||
|
this.length = 0;
|
||||||
|
this._computeSegments(curve.getCurveValues(), 0, 1);
|
||||||
|
},
|
||||||
|
|
||||||
|
_computeSegments: function(values, minT, maxT) {
|
||||||
|
// Check if the t-span is big enough for subdivision.
|
||||||
|
// We're not subdividing more than 32 times...
|
||||||
|
if ((maxT - minT) > 1 / 32
|
||||||
|
&& !Curve.isSufficientlyFlat.apply(Curve, values)) {
|
||||||
|
var curves = Curve.subdivide.apply(Curve, values);
|
||||||
|
var halfT = (minT + maxT) / 2;
|
||||||
|
// Recursively subdive and compute segments again.
|
||||||
|
this._computeSegments(curves[0], minT, halfT);
|
||||||
|
this._computeSegments(curves[1], halfT, maxT);
|
||||||
|
} else {
|
||||||
|
// Calculate distance between p1 and p2
|
||||||
|
var x = values[6] - values[0],
|
||||||
|
y = values[7] - values[1],
|
||||||
|
dist = Math.sqrt(x * x + y * y);
|
||||||
|
if (dist > Numerical.TOLERANCE) {
|
||||||
|
this.length += dist;
|
||||||
|
this.segments.push({
|
||||||
|
length: this.length,
|
||||||
|
value: maxT
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
getParameter: function(length) {
|
||||||
|
// Find the segment that succeeds the given length, then interpolate
|
||||||
|
// with the previous segment
|
||||||
|
for (var i = 0, l = this.segments.length; i < l; i++) {
|
||||||
|
var segment = this.segments[i];
|
||||||
|
if (segment.length >= length) {
|
||||||
|
var prev = this.segments[i - 1],
|
||||||
|
prevValue = prev ? prev.value : 0,
|
||||||
|
prevLength = prev ? prev.length : 0;
|
||||||
|
// Interpolate
|
||||||
|
return prevValue + (segment.value - prevValue)
|
||||||
|
* (length - prevLength) / (segment.length - prevLength);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
});
|
Loading…
Reference in a new issue