]> git.scottworley.com Git - nt3d/commitdiff
Remove degenerate faces
authorScott Worley <ScottWorley@ScottWorley.com>
Sat, 29 Dec 2012 08:08:19 +0000 (00:08 -0800)
committerScott Worley <ScottWorley@ScottWorley.com>
Sat, 29 Dec 2012 08:08:19 +0000 (00:08 -0800)
nt3d.js

diff --git a/nt3d.js b/nt3d.js
index 33e271b406648189e2642000cd2785e6ae208681..3ce05be192449917990be333d3a0b8a6621b6c17 100644 (file)
--- a/nt3d.js
+++ b/nt3d.js
@@ -297,6 +297,17 @@ nt3d = {
                                angle),
                        center);
        },
                                angle),
                        center);
        },
+       point_equal: function(a, b, epsilon) {
+               return Math.abs(a[0] - b[0]) < epsilon &&
+                      Math.abs(a[1] - b[1]) < epsilon &&
+                      Math.abs(a[2] - b[2]) < epsilon;
+       },
+       degenerate_face_epsilon: 1e-10,
+       is_degenerate: function(a, b, c) {
+               return this.point_equal(a, b, this.degenerate_face_epsilon) ||
+                      this.point_equal(b, c, this.degenerate_face_epsilon) ||
+                      this.point_equal(c, a, this.degenerate_face_epsilon);
+       },
        go: function() {
                // Remove any previous download links
                var old_download_link = document.getElementById("nt3d_download");
        go: function() {
                // Remove any previous download links
                var old_download_link = document.getElementById("nt3d_download");
@@ -323,11 +334,10 @@ nt3d = {
                if (this.points.length % 3 != 0) {
                        alert("Points list length not divisble by 3!");
                }
                if (this.points.length % 3 != 0) {
                        alert("Points list length not divisble by 3!");
                }
-               var n = this.points.length / 3;
                var nan_count = 0;
                var nan_point_count = 0;
                var nan_face_count = 0;
                var nan_count = 0;
                var nan_point_count = 0;
                var nan_face_count = 0;
-               for (var i = 0; i < n; i++) {
+               for (var i = 0; i < this.points.length/3; i++) {
                        var nan_in_face = false;
                        for (var j = 0; j < 3; j++) {
                                var nan_in_point = false;
                        var nan_in_face = false;
                        for (var j = 0; j < 3; j++) {
                                var nan_in_point = false;
@@ -346,9 +356,24 @@ nt3d = {
                        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.");
                }
 
+               // Remove degenerate faces
+               var degenerate_face_count = 0;
+               for (var i = 0; i < this.points.length/3; i++) {
+                       if (this.is_degenerate(this.points[i*3+0], 
+                                              this.points[i*3+1], 
+                                              this.points[i*3+2])) {
+                               this.points.splice(i*3, 3);
+                               i--;
+                               degenerate_face_count ++;
+                       }
+               }
+               if (degenerate_face_count != 0) {
+                       console.log("Removed " + degenerate_face_count + " degenerate faces");
+               }
+
                // Make STL
                this.stl = "solid " + this.user_function.name + "\n";
                // Make STL
                this.stl = "solid " + this.user_function.name + "\n";
-               for (var i = 0; i < n; i++) {
+               for (var i = 0; i < this.points.length/3; i++) {
                        var a = this.points[i*3+0];
                        var b = this.points[i*3+1];
                        var c = this.points[i*3+2];
                        var a = this.points[i*3+0];
                        var b = this.points[i*3+1];
                        var c = this.points[i*3+2];