Remove tolerance parameter from solveCubic() / solveQuadratic() since we should always use EPSILON.

This commit is contained in:
Jürg Lehni 2013-04-20 19:58:42 -07:00
parent 14aa8e5dea
commit c45ad26b67
2 changed files with 15 additions and 14 deletions

View file

@ -533,8 +533,7 @@ statics: {
c = 3 * (c1 - p1), c = 3 * (c1 - p1),
b = 3 * (c2 - c1) - c, b = 3 * (c2 - c1) - c,
a = p2 - p1 - c - b; a = p2 - p1 - c - b;
return Numerical.solveCubic(a, b, c, p1 - val, roots, return Numerical.solveCubic(a, b, c, p1 - val, roots);
/*#=*/ Numerical.EPSILON);
}, },
getParameterOf: function(v, x, y) { getParameterOf: function(v, x, y) {
@ -636,8 +635,7 @@ statics: {
var a = 3 * (v1 - v2) - v0 + v3, var a = 3 * (v1 - v2) - v0 + v3,
b = 2 * (v0 + v2) - 4 * v1, b = 2 * (v0 + v2) - 4 * v1,
c = v1 - v0, c = v1 - v0,
count = Numerical.solveQuadratic(a, b, c, roots, count = Numerical.solveQuadratic(a, b, c, roots),
/*#=*/ Numerical.TOLERANCE),
// Add some tolerance for good roots, as t = 0 / 1 are added // Add some tolerance for good roots, as t = 0 / 1 are added
// seperately anyhow, and we don't want joins to be added with // seperately anyhow, and we don't want joins to be added with
// radiuses in getStrokeBounds() // radiuses in getStrokeBounds()

View file

@ -132,16 +132,17 @@ var Numerical = this.Numerical = new function() {
* *
* a*x^2 + b*x + c = 0 * a*x^2 + b*x + c = 0
*/ */
solveQuadratic: function(a, b, c, roots, tolerance) { solveQuadratic: function(a, b, c, roots) {
// Code ported over and adapted from Uintah library (MIT license). // Code ported over and adapted from Uintah library (MIT license).
// If problem is actually linear, return 0 or 1 easy roots var epsilon = this.EPSILON;
if (abs(a) < tolerance) { // If a is 0, equation is actually linear, return 0 or 1 easy roots.
if (abs(b) >= tolerance) { if (abs(a) < epsilon) {
if (abs(b) >= epsilon) {
roots[0] = -c / b; roots[0] = -c / b;
return 1; return 1;
} }
// If all the coefficients are 0, we have infinite solutions! // If all the coefficients are 0, we have infinite solutions!
return abs(c) < tolerance ? -1 : 0; // Infinite or 0 solutions return abs(c) < epsilon ? -1 : 0; // Infinite or 0 solutions
} }
var q = b * b - 4 * a * c; var q = b * b - 4 * a * c;
if (q < 0) if (q < 0)
@ -161,10 +162,12 @@ var Numerical = this.Numerical = new function() {
* *
* a*x^3 + b*x^2 + c*x + d = 0 * a*x^3 + b*x^2 + c*x + d = 0
*/ */
solveCubic: function(a, b, c, d, roots, tolerance) { solveCubic: function(a, b, c, d, roots) {
// Code ported over and adapted from Uintah library (MIT license). // Code ported over and adapted from Uintah library (MIT license).
if (abs(a) < tolerance) var epsilon = this.EPSILON;
return Numerical.solveQuadratic(b, c, d, roots, tolerance); // If a is 0, equation is actually quadratic.
if (abs(a) < epsilon)
return Numerical.solveQuadratic(b, c, d, roots);
// Normalize to form: x^3 + b x^2 + c x + d = 0: // Normalize to form: x^3 + b x^2 + c x + d = 0:
b /= a; b /= a;
c /= a; c /= a;
@ -178,8 +181,8 @@ var Numerical = this.Numerical = new function() {
D = q * q - ppp; D = q * q - ppp;
// Substitute x = y - b/3 to eliminate quadric term: x^3 +px + q = 0 // Substitute x = y - b/3 to eliminate quadric term: x^3 +px + q = 0
b /= 3; b /= 3;
if (abs(D) < tolerance) { if (abs(D) < epsilon) {
if (abs(q) < tolerance) { // One triple solution. if (abs(q) < epsilon) { // One triple solution.
roots[0] = - b; roots[0] = - b;
return 1; return 1;
} else { // One single and one double solution. } else { // One single and one double solution.