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.
},
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));
},