]> git.scottworley.com Git - nt3d/commitdiff
Generalize rotate()
authorScott Worley <ScottWorley@ScottWorley.com>
Wed, 19 Dec 2012 14:38:26 +0000 (06:38 -0800)
committerScott Worley <ScottWorley@ScottWorley.com>
Wed, 19 Dec 2012 14:38:26 +0000 (06:38 -0800)
1. Rename the old rotate() to rotate_about_origin().
2. Add a general rotate() that can rotate about any point.
3. Add box_by_rotation.html demo.

box_by_rotation.html [new file with mode: 0644]
nt3d.js

diff --git a/box_by_rotation.html b/box_by_rotation.html
new file mode 100644 (file)
index 0000000..396c714
--- /dev/null
@@ -0,0 +1,28 @@
+<html>
+  <head>
+    <title>Box by rotation</title>
+    <script type="text/javascript" src="nt3d.js"></script>
+    <script type="text/javascript">
+      function box_by_rotation(size_as_string) {
+        var size = parseFloat(size_as_string);
+        var origin = [0,    0,    0   ];
+        var x      = [size, 0,    0   ];
+        var y      = [0,    size, 0   ];
+        var xy     = [size, size, 0   ];
+        var xy_face = nt3d.quad(origin, y, xy, x);
+       return [].concat(
+         xy_face,
+         nt3d.rotate_about_origin(xy_face, nt3d.unit([1,1,1]),  2*Math.PI/3), // yz
+         nt3d.rotate_about_origin(xy_face, nt3d.unit([1,1,1]), -2*Math.PI/3), // xz
+         nt3d.rotate(xy_face, [0.5, 0, 0.5], [0, 1, 0], Math.PI), // far xy (top)
+         nt3d.rotate(xy_face, [1, 1, 0], nt3d.unit([-1, -1, 1]),  2*Math.PI/3),  // far yz
+         nt3d.rotate(xy_face, [1, 1, 0], nt3d.unit([-1, -1, 1]), -2*Math.PI/3)); // far xz
+      }
+      var params = [["Size", 1]];
+    </script>
+  </head>
+  <body onload="nt3d.framework(box_by_rotation, params)">
+    <h1>Box by rotation</h1>
+    <p>Make a box by specifying one face, then copy-rotating it five times.</p>
+  </body>
+</html>
diff --git a/nt3d.js b/nt3d.js
index 3d87ffb90e3ec1b5569ad71f41058a9a8bc3fae0..1cabfb1bf2ffb6fd9394356a7dccb7346f394c74 100644 (file)
--- a/nt3d.js
+++ b/nt3d.js
@@ -92,7 +92,7 @@ nt3d = {
                        var rot1axis = this.unit(this.cross([0,0,1], shapenormals[i]));
                        var rot1angle = this.angle_between([0,0,1], this.unit(shapenormals[i]));
                        if (rot1angle > 1e-7) {
                        var rot1axis = this.unit(this.cross([0,0,1], shapenormals[i]));
                        var rot1angle = this.angle_between([0,0,1], this.unit(shapenormals[i]));
                        if (rot1angle > 1e-7) {
-                               loop = this.rotate(loop, rot1axis, rot1angle);
+                               loop = this.rotate_about_origin(loop, rot1axis, rot1angle);
                        }
 
                        // 2. Rotate around shapenormals[i] so that [1,0,0]
                        }
 
                        // 2. Rotate around shapenormals[i] so that [1,0,0]
@@ -100,7 +100,7 @@ nt3d = {
                        var rot2axis = this.unit(shapenormals[i]);
                        var rot2angle = this.angle_between([1,0,0], this.unit(fixedpathnormals[i]));
                        if (rot2angle > 1e-7) {
                        var rot2axis = this.unit(shapenormals[i]);
                        var rot2angle = this.angle_between([1,0,0], this.unit(fixedpathnormals[i]));
                        if (rot2angle > 1e-7) {
-                               loop = this.rotate(loop, rot2axis, rot2angle);
+                               loop = this.rotate_about_origin(loop, rot2axis, rot2angle);
                        }
                        // This would probably be faster and more numerically stable
                        // if the two rotations were applied as one combined operation
                        }
                        // This would probably be faster and more numerically stable
                        // if the two rotations were applied as one combined operation
@@ -140,6 +140,9 @@ nt3d = {
                        a[1] - b[1],
                        a[2] - b[2]];
        },
                        a[1] - b[1],
                        a[2] - b[2]];
        },
+       neg: function(a) {
+               return [-a[0], -a[1], -a[2]];
+       },
        dot: function(a, b) {
                return a[0]*b[0] + a[1]*b[1] + a[2]*b[2];
        },
        dot: function(a, b) {
                return a[0]*b[0] + a[1]*b[1] + a[2]*b[2];
        },
@@ -170,7 +173,7 @@ nt3d = {
        angle_between: function(a, b) { // a and b must be unit vectors
                return Math.acos(this.dot(a, b));
        },
        angle_between: function(a, b) { // a and b must be unit vectors
                return Math.acos(this.dot(a, b));
        },
-       rotate: function(points, axis, angle) { // axis must be a unit vector
+       rotate_about_origin: function(points, axis, angle) { // axis must be a unit vector
                // From http://inside.mines.edu/~gmurray/ArbitraryAxisRotation/
                var cosangle = Math.cos(angle);
                var sinangle = Math.sin(angle);
                // From http://inside.mines.edu/~gmurray/ArbitraryAxisRotation/
                var cosangle = Math.cos(angle);
                var sinangle = Math.sin(angle);
@@ -185,6 +188,14 @@ nt3d = {
                }
                return rotated;
        },
                }
                return rotated;
        },
+       rotate: function(points, center, axis, angle) { // axis must be a unit vector
+               return this.translate(
+                       this.rotate_about_origin(
+                               this.translate(points, this.neg(center)),
+                               axis,
+                               angle),
+                       center);
+       },
        go: function() {
                // Get params from form
                var params = [];
        go: function() {
                // Get params from form
                var params = [];