Mono-curves: No need to filter out curves with no length any more.

This commit is contained in:
Jürg Lehni 2016-07-16 20:05:25 +02:00
parent b1037f89f1
commit 8513144ae1

View file

@ -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;