<html> <head> <title>Serrated</title> <script type="text/javascript" src="nt3d.js"></script> <script type="text/javascript"> function serrated(params) { var tau = 2 * Math.PI; var path_length = params.num_serrations * params.steps_per_serration; var path = []; for (var i = 0; i <= path_length; i++) { path[i] = [params.length*i/path_length,0,0]; } var serration_length = params.length / params.num_serrations; var serration_half_length = serration_length / 2; var serration_radius = serration_half_length / Math.sin(tau * params.arc / 2); var serration_max_height = Math.sqrt(serration_radius*serration_radius - serration_half_length*serration_half_length); // This emits a Sabre Grind. TODO: Support a double bevel. // http://en.wikipedia.org/wiki/Grind#Typical_grinds // http://www.allaboutpocketknives.com/images/aapk_content/blade_bevel.JPG var edge_height = params.thickness / (2 * Math.tan(tau * params.edge_bevel_angle)); function shape(i) { var serration_progress = (i % params.steps_per_serration) / params.steps_per_serration; var serration_x = serration_progress * serration_length - serration_half_length; var serration_height = serration_max_height - Math.sqrt(serration_radius*serration_radius - serration_x*serration_x); if (params.arc < 0) serration_height *= -1; var blade_height = params.depth + serration_height; return [[0, 0, 0], [blade_height - edge_height, 0, 0], [blade_height, params.thickness/2, 0], [blade_height - edge_height, params.thickness, 0], [0, params.thickness, 0]]; } return nt3d.extrude(path, shape, [1,0,0], [0,0,1]); } var params = [["length", 100, ], ["thickness", 2], ["depth", 10], ["num_serrations", 10], ["arc", .2, "Arc of Each Serration (in turns)"], ["steps_per_serration", 11], ["edge_bevel_angle", .05, "Edge Bevel Angle (in turns)"]]; </script> </head> <body onload="nt3d.framework(serrated, params)"> <h1>Serrated</h1> <p>Make a serrated blade.</p> </body> </html>