return nt3d.sub(path[i+1], path[i-1]);
};
},
+ pathnormals_from_point: function(path, p) {
+ // Use this with any point that is not on any path tangent line
+ var pathnormals = [];
+ for (var i = 0; i < path.length; i++) {
+ pathnormals.push(this.sub(path[i], p));
+ }
+ return pathnormals;
+ },
to_function: function(thing, make_indexer) {
// If thing is a point, just yield thing every time.
// If thing is a list of points && make_indexer, index into thing.
},
extrude: function(path, shape, shapenormals, pathnormals) {
- var guts_result = nt3d._extrude_guts(path, shape, shapenormals, pathnormals);
+ var guts_result = this._extrude_guts(path, shape, shapenormals, pathnormals);
// Add the end-caps
// XXX: This doesn't work if shape is not convex
return guts_result.points.concat(
- nt3d.trianglefan(guts_result.first_loop.reverse()),
- nt3d.trianglefan(guts_result.last_loop));
+ this.trianglefan(guts_result.first_loop.reverse()),
+ this.trianglefan(guts_result.last_loop));
},
closed_extrude: function(path, shape, shapenormals, pathnormals) {
- var guts_result = nt3d._extrude_guts(path, shape, shapenormals, pathnormals);
+ var guts_result = this._extrude_guts(path, shape, shapenormals, pathnormals);
// Stitch the ends together
return guts_result.points.concat(
- nt3d.closed_quadstrip(nt3d.zip(guts_result.first_loop, guts_result.last_loop)));
+ this.closed_quadstrip(this.zip(guts_result.first_loop, guts_result.last_loop)));
},
_extrude_guts: function(path, shape, shapenormals, pathnormals) {
var shape_fun = this.to_function(shape, false);
if (i == 0) {
result.first_loop = loop;
} else {
- result.points = result.points.concat(nt3d.closed_quadstrip(nt3d.zip(loop, prev_loop)));
+ result.points = result.points.concat(this.closed_quadstrip(this.zip(loop, prev_loop)));
}
prev_loop = loop;
}
},
project: function(a, b) { // Project b onto a
var a_magnitude = this.magnitude(a);
- return this.scale(a, this.dot(a, b) / a_magnitude * a_magnitude);
+ return this.scale(a, this.dot(a, b) / (a_magnitude * a_magnitude));
},
project_to_orthogonal: function(a, b) {
// The nearest thing to b that is orthogonal to a
translate: function(points, offset) {
var translated = [];
for (var i = 0; i < points.length; i++) {
- translated[i] = [points[i][0] + offset[0],
- points[i][1] + offset[1],
- points[i][2] + offset[2]];
+ translated[i] = this.translate_point(points[i], offset);
}
return translated;
},
+ translate_point: function(point, offset) {
+ return [point[0] + offset[0],
+ point[1] + offset[1],
+ point[2] + offset[2]];
+ },
angle_between: function(a, b) { // a and b must be unit vectors
return Math.acos(this.dot(a, b));
},