--- /dev/null
+<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>
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]
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
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];
},
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);
}
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 = [];