/**
 * File: dragon.js
 *
 * Written by Simon Cross in 2008 and released
 * into the public domain [1].
 *
 * Dragon Curve [2] implemented in SVG+Javascript.
 *
 * [1] http://creativecommons.org/licenses/publicdomain/
 * [2] http://en.wikipedia.org/wiki/Dragon_curve
 */

var max_iter = 14;

function dragon(divid) {
  $('#' + divid).svg();
  var svg = $('#' + divid).svg('get');
  animate_dragon(svg, 1);
}

function animate_dragon(svg, iter) {
  dragon_svg(svg, iter);

  next = function () {
      animate_dragon(svg, iter+1);
  }

  if (iter < max_iter)
    setTimeout(next, 200);
}

function dragon_svg(svg, iter) {
  var points = [[250.0, 200.0]];
  var L = 400.0 / Math.max(max_iter/1.25 - iter,1);

  var p = points[0];
  var max_n = Math.pow(2, iter);
  var step_len = L / ( Math.pow(Math.sqrt(2), iter-1) );
  
  // direction
  // R = ( 0 -1 )  L = (  0 1 )
  //     ( 1  0 )      ( -1 0 )
  var dir = [step_len, 0.0];

  // initial rotations
  var t = (Math.PI / 4.0) * ((iter+2) % 8);
  var r = [ [ Math.cos(t), Math.sin(t) ],
            [ Math.sin(t), -Math.cos(t) ] ];

  dir = [ r[0][0] * dir[0] + r[0][1] * dir[1],
          r[1][0] * dir[0] + r[1][1] * dir[1]
        ];

  p = [ p[0] + dir[0], p[1] + dir[1] ];
  points.push(p);
  
  for (var n=0; n < max_n; n++) {
    if (((n & -n) << 1) & n) {
      // turn right
      dir = [ - dir[1], dir[0] ];
    }
    else {
      // turn left
      dir = [ dir[1], - dir[0] ];
    }
    
    p = [ p[0] + dir[0], p[1] + dir[1] ];
    points.push(p);
  }

  svg.clear();
  svg.polyline(points, {fill:  'none', stroke: 'black', 'stroke-width': 1.0});
}
