diff --git a/src/path/Curve.js b/src/path/Curve.js index a6cf2e90..63de4dce 100644 --- a/src/path/Curve.js +++ b/src/path/Curve.js @@ -635,43 +635,39 @@ statics: /** @lends Curve */{ * only containing its values are returned. */ getMonoCurves: function(v, dir) { - var curves = []; - // #getLength() is a rather expensive operation, therefore we test two - // cheap preconditions first. - if (v[0] !== v[6] || v[1] === v[7] || Curve.getLength(v) !== 0) { + var curves = [], // Determine the ordinate index in the curve values array. - var io = dir ? 0 : 1, - o0 = v[io], - o1 = v[io + 2], - o2 = v[io + 4], - o3 = v[io + 6]; - if ((o0 >= o1) === (o1 >= o2) && (o1 >= o2) === (o2 >= o3) - || Curve.isStraight(v)) { - // Straight curves and curves with all involved points ordered - // in coordinate direction are guaranteed to be monotone. + io = dir ? 0 : 1, + o0 = v[io], + o1 = v[io + 2], + o2 = v[io + 4], + o3 = v[io + 6]; + if ((o0 >= o1) === (o1 >= o2) && (o1 >= o2) === (o2 >= o3) + || Curve.isStraight(v)) { + // Straight curves and curves with all involved points ordered + // in coordinate direction are guaranteed to be monotone. + curves.push(v); + } else { + var a = 3 * (o1 - o2) - o0 + o3, + b = 2 * (o0 + o2) - 4 * o1, + c = o1 - o0, + tMin = 4e-7, + tMax = 1 - tMin, + roots = [], + n = Numerical.solveQuadratic(a, b, c, roots, tMin, tMax); + if (n === 0) { curves.push(v); } else { - var a = 3 * (o1 - o2) - o0 + o3, - b = 2 * (o0 + o2) - 4 * o1, - c = o1 - o0, - tMin = 4e-7, - tMax = 1 - tMin, - roots = [], - n = Numerical.solveQuadratic(a, b, c, roots, tMin, tMax); - if (n === 0) { - curves.push(v); - } else { - roots.sort(); - var t = roots[0], - parts = Curve.subdivide(v, t); + roots.sort(); + var t = roots[0], + parts = Curve.subdivide(v, t); + curves.push(parts[0]); + if (n > 1) { + t = (roots[1] - t) / (1 - t); + parts = Curve.subdivide(parts[1], t); curves.push(parts[0]); - if (n > 1) { - t = (roots[1] - t) / (1 - t); - parts = Curve.subdivide(parts[1], t); - curves.push(parts[0]); - } - curves.push(parts[1]); } + curves.push(parts[1]); } } return curves;