|
// Generated by CoffeeScript 1.10.0 |
|
(function() { |
|
var height, hquad, indices, quad_layout, quads, rects, scale, svg, vis, width; |
|
|
|
scale = 480; |
|
|
|
svg = d3.select('svg'); |
|
|
|
vis = svg.append('g').attr({ |
|
transform: "translate(" + (scale / 2) + ", 10)" |
|
}); |
|
|
|
width = svg.node().getBoundingClientRect().width; |
|
|
|
height = svg.node().getBoundingClientRect().height; |
|
|
|
quad_layout = function(mapping, size) { |
|
return function(digits) { |
|
var m; |
|
m = mapping(digits); |
|
return { |
|
x: m.j / Math.pow(2, m.n) * size, |
|
y: m.i / Math.pow(2, m.n) * size, |
|
dx: 1 / Math.pow(2, m.n) * size, |
|
dy: 1 / Math.pow(2, m.n) * size, |
|
digits: m.digits |
|
}; |
|
}; |
|
}; |
|
|
|
hquad = function(digits) { |
|
var d, i, i_temp, j, k, l, n; |
|
n = digits.length; |
|
l = 1; |
|
i = 0; |
|
j = 0; |
|
for (k = digits.length - 1; k >= 0; k += -1) { |
|
d = digits[k]; |
|
switch (d) { |
|
case '0': |
|
i_temp = i; |
|
i = j; |
|
j = i_temp; |
|
break; |
|
case '1': |
|
i += l; |
|
break; |
|
case '2': |
|
i += l; |
|
j += l; |
|
break; |
|
case '3': |
|
i_temp = i; |
|
i = l - j - 1; |
|
j = 2 * l - i_temp - 1; |
|
} |
|
l = 2 * l; |
|
} |
|
return { |
|
j: j, |
|
i: i, |
|
n: n, |
|
digits: digits |
|
}; |
|
}; |
|
|
|
|
|
/* Visualization |
|
*/ |
|
|
|
indices = ["0", "10", "11", "12", "13", "200", "201", "202", "203", "210", "211", "212", "213", "220", "221", "222", "223", "230", "231", "232", "233", "230", "231", "232", "233", "3000", "3001", "3002", "301", "302", "303", "31", "32"]; |
|
|
|
quads = indices.map(quad_layout(hquad, 480)); |
|
|
|
rects = vis.selectAll('rect').data(quads); |
|
|
|
rects.enter().append('g'); |
|
|
|
rects.append('rect').attr({ |
|
x: function(d) { |
|
return d.x; |
|
}, |
|
y: function(d) { |
|
return d.y; |
|
}, |
|
width: function(d) { |
|
return d.dx; |
|
}, |
|
height: function(d) { |
|
return d.dy; |
|
} |
|
}).append('title').text(function(d) { |
|
return "x: " + d.x + "\ny: " + d.y + "\nw/h: " + d.dx; |
|
}); |
|
|
|
rects.append('text').attr({ |
|
x: function(d) { |
|
return d.x + (d.dx / 2); |
|
}, |
|
y: function(d) { |
|
return d.y + (d.dy / 2); |
|
}, |
|
'text-anchor': 'middle', |
|
dy: '0.35em', |
|
'font-size': function(d) { |
|
return d.dx / 5; |
|
} |
|
}).text(function(d) { |
|
return d.digits; |
|
}); |
|
|
|
}).call(this); |