X-Git-Url: http://git.scottworley.com/nt3d/blobdiff_plain/6e5e17591a2a5adac5e4ec016c7bad71505b1e64..08b46dbddc6defd45926a69631e3a09ea2273e45:/nt3d.js?ds=sidebyside diff --git a/nt3d.js b/nt3d.js index 3ce05be..7198e22 100644 --- a/nt3d.js +++ b/nt3d.js @@ -259,7 +259,14 @@ nt3d = { point[2] + offset[2]]; }, angle_between: function(a, b) { // a and b must be unit vectors - return Math.acos(this.dot(a, b)); + var the_dot = this.dot(a, b); + if (the_dot <= -1) { + return Math.PI; + } + if (the_dot >= 1) { + return 0; + } + return Math.acos(the_dot); }, rotate_about_origin: function(points, axis, angle) { // axis must be a unit vector // From http://inside.mines.edu/~gmurray/ArbitraryAxisRotation/ @@ -281,8 +288,8 @@ nt3d = { // by crossing a and b to get a rotation axis and using // angle_between to get a rotation angle. var angle = this.angle_between(this.unit(a), this.unit(b)); - if (Math.abs(angle) < 1e-15) { - // No siginificant rotation to perform. Bail to avoid + if (Math.abs(angle) < 1e-7) { + // No significant rotation to perform. Bail to avoid // NaNs and numerical error return points; } @@ -353,7 +360,7 @@ nt3d = { if (nan_in_face) nan_face_count ++; } if (nan_count != 0) { - alert(nan_count + " NaNs in " + nan_point_count + " points in " + nan_face_count + " faces."); + alert(nan_count + " NaNs in " + nan_point_count + " points in " + nan_face_count + " faces (" + (100 * nan_face_count / (this.points.length/3)) + "% of faces)."); } // Remove degenerate faces