<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>