Introduce Numerical.isZero(), for comparisons against 0 with a tolerance.

This commit is contained in:
Jürg Lehni 2012-11-05 21:06:13 -08:00
parent 125fa1c051
commit 400b454177
7 changed files with 16 additions and 11 deletions

View file

@ -75,7 +75,7 @@ var Line = this.Line = Base.extend(/** @lends Line# */{
intersect: function(line) {
var cross = this.vector.cross(line.vector);
// Avoid divisions by 0, and errors when getting too close to 0
if (Math.abs(cross) <= Numerical.EPSILON)
if (Numerical.isZero(cross))
return null;
var v = line.point.subtract(this.point),
t1 = v.cross(line.vector) / cross,
@ -96,7 +96,7 @@ var Line = this.Line = Base.extend(/** @lends Line# */{
var v1 = this.vector,
v2 = point.subtract(this.point),
ccw = v2.cross(v1);
if (ccw == 0) {
if (ccw === 0) {
ccw = v2.dot(v1);
if (ccw > 0) {
ccw = v2.subtract(v1).dot(v1);

View file

@ -446,7 +446,7 @@ var Matrix = this.Matrix = Base.extend(/** @lends Matrix# */{
*/
_getDeterminant: function() {
var det = this._a * this._d - this._b * this._c;
return isFinite(det) && Math.abs(det) > Numerical.EPSILON
return isFinite(det) && !Numerical.isZero(det)
&& isFinite(this._tx) && isFinite(this._ty)
? det : null;
},

View file

@ -701,7 +701,7 @@ var Point = this.Point = Base.extend(/** @lends Point# */{
* @returns {Boolean} {@true both x and y are 0}
*/
isZero: function() {
return this.x == 0 && this.y == 0;
return Numerical.isZero(this.x) && Numerical.isZero(this.y);
},
/**

View file

@ -360,7 +360,7 @@ var Size = this.Size = Base.extend(/** @lends Size# */{
* @return {Boolean} {@true both width and height are 0}
*/
isZero: function() {
return this.width == 0 && this.height == 0;
return Numerical.isZero(this.width) && Numerical.isZero(this.height);
},
/**

View file

@ -724,10 +724,7 @@ var Curve = this.Curve = Base.extend(/** @lends Curve# */{
// with x-axis.
if (isFlatEnough(w)) {
var line = new Line(w[0], w[5], true);
// Compare the line's squared length with EPSILON. If we're
// below, #intersect() will return null because of division
// by near-zero.
return [ line.vector.getLength(true) <= Numerical.EPSILON
return [ Numerical.isZero(line.vector.getLength(true))
? line.point.x
: xAxis.intersect(line).x ];
}

View file

@ -51,7 +51,7 @@ var SegmentPoint = Point.extend({
// Provide our own version of Point#isZero() that does not use the x / y
// accessors but the internal properties directly, for performance
// reasons, since it is used a lot internally.
return this._x == 0 && this._y == 0;
return Numerical.isZero(this._x) && Numerical.isZero(this._y);
},
setSelected: function(selected) {

View file

@ -74,7 +74,15 @@ var Numerical = new function() {
EPSILON: 10e-12,
/**
* Gauss-Legendre Numerical Integration
* Check if the value is 0, within a tolerance defined by
* Numerical.EPSILON.
*/
isZero: function(val) {
return Math.abs(val) <= this.EPSILON;
},
/**
* Gauss-Legendre Numerical Integration.
*/
integrate: function(f, a, b, n) {
var x = abscissas[n - 2],