(function() { var arc_g, arc_gen, c, ctrls, drag, l, offset, pinch_offset, q, redraw, svg; svg = d3.select('svg'); q = 3; offset = 0; c = 40; l = 70; arc_gen = d3.svg.arc().innerRadius(100).outerRadius(200); arc_g = svg.append('g').attr('transform', 'rotate(90)'); pinch_offset = null; drag = d3.behavior.drag().on('drag', function() { var angle; if (!(pinch_offset != null)) { pinch_offset = 180 / Math.PI * Math.atan2(d3.event.y, d3.event.x) + 180 - offset; } angle = 180 / Math.PI * Math.atan2(d3.event.y, d3.event.x) + 180; offset = angle - pinch_offset; return redraw(); }).on('dragend', function() { return pinch_offset = null; }); redraw = function() { var arcs, colors, delta, h; delta = 360 / q; colors = (function() { var _results; _results = []; for (h = 0; 0 <= q ? h < q : h > q; 0 <= q ? h++ : h--) { _results.push(d3.hcl((h * delta + offset) % 360, c, l)); } return _results; })(); arc_gen.startAngle(function(d) { return (d.h - delta / 2 + 270) * Math.PI / 180; }).endAngle(function(d) { return (d.h + delta / 2 + 270) * Math.PI / 180; }); arcs = arc_g.selectAll('.arc').data(colors); arcs.enter().append('path').attr('class', 'arc').call(drag); arcs.exit().remove(); arc_g.selectAll('.arc').attr('d', arc_gen).attr('fill', function(d) { return d; }); return svg.select('#q').text(q); }; svg.append('text').attr('class', 'label').attr('id', 'q').attr('dy', '0.30em').text(q); ctrls = svg.append('g').attr('id', 'controls'); ctrls.append('circle').attr('r', 100).attr('fill', 'transparent'); ctrls.append('text').attr('class', 'label control').attr('dx', '70px').attr('dy', '0.30em').text('+').on('click', function() { q = q === 36 ? 1 : q + 1; return redraw(); }); ctrls.append('text').attr('class', 'label control').attr('dx', '-70px').attr('dy', '0.30em').text('-').on('click', function() { q = q === 1 ? 36 : q - 1; return redraw(); }); redraw(); }).call(this);