// Generated by CoffeeScript 1.10.0 (function() { var GOSPER_ANGLE, INITIAL_SCALE, data, get_hept_coords, get_hex_data, height, rec, svg, vis, width; width = 960; height = 500; data = []; INITIAL_SCALE = height / 2.4; GOSPER_ANGLE = Math.acos(5 * Math.sqrt(7) / 14) / Math.PI * 180; svg = d3.select('svg').attr({ width: width, height: height, viewBox: (-width / 2) + " " + (-height / 2) + " " + width + " " + height }); vis = svg.append('g'); get_hept_coords = function(scale, index) { var a, coords, r; a = scale / Math.sqrt(7); r = a / Math.sin(Math.PI / 3); coords = [ { x: -a, y: r + r / 2 }, { x: a, y: r + r / 2 }, { x: 0, y: 0 }, { x: -2 * a, y: 0 }, { x: -a, y: -r - r / 2 }, { x: a, y: -r - r / 2 }, { x: 2 * a, y: 0 } ]; return coords[index]; }; /* Returns the rotation, translation and scale of a certain hexagon described as a base 7 number */ get_hex_data = function(indexes) { var hept_coords, i, index, j, len, rotation, scale, scale_i, translation; rotation = GOSPER_ANGLE * indexes.length; translation = { x: 0, y: 0 }; scale = 1 / Math.pow(Math.sqrt(7), indexes.length); for (i = j = 0, len = indexes.length; j < len; i = ++j) { index = indexes[i]; scale_i = 1 / Math.pow(Math.sqrt(7), i); hept_coords = get_hept_coords(scale_i, index); hept_coords = hept_tree_utils.rotate_point(hept_coords, GOSPER_ANGLE * (i + 1)); translation.x += hept_coords.x; translation.y += hept_coords.y; } return { rotation: rotation, translation: translation, scale: scale }; }; rec = function(order, index) { var i, j, results; if (order === 0) { data.push(get_hex_data(index)); return; } data.push(get_hex_data(index)); results = []; for (i = j = 0; j <= 6; i = ++j) { results.push(rec(order - 1, index.concat([i]))); } return results; }; rec(Math.floor(Math.random() * 5), []); vis.selectAll('path').data(data).enter().append('path').attr({ "class": 'hex', d: function(d) { return hept_tree_utils.hex_generate_svg_path(d.scale * INITIAL_SCALE, 0); }, transform: function(d) { return "translate(" + (d.translation.x * INITIAL_SCALE) + ", " + (d.translation.y * INITIAL_SCALE) + ") rotate(" + d.rotation + ")"; } }); }).call(this);