attempt at a treemap fisheye
by Nivaldo
JavaScript
// Fisheye plugin
(function () {
d3.fisheye = {
scale: function (scaleType) {
return d3_fisheye_scale(scaleType(), 3, 0);
},
circular: function () {
var radius = 200,
distortion = 2,
k0,
k1,
focus = [0, 0];
function fisheye(d) {
var dx = d.x - focus[0],
dy = d.y - focus[1],
dd = Math.sqrt(dx * dx + dy * dy);
if (!dd || dd >= radius) return {
x: d.x,
y: d.y,
z: 1
};
var k = k0 * (1 - Math.exp(-dd * k1)) / dd * .75 + .25;
return {
x: focus[0] + dx * k,
y: focus[1] + dy * k,
z: Math.min(k, 10)
};
}
function rescale() {
k0 = Math.exp(distortion);
k0 = k0 / (k0 - 1) * radius;
k1 = distortion / radius;
return fisheye;
}
fisheye.radius = function (_) {
if (!arguments.length) return radius;
radius = +_;
return rescale();
};
fisheye.distortion = function (_) {
if (!arguments.length) return distortion;
distortion = +_;
return rescale();
};
fisheye.focus = function (_) {
if (!arguments.length) return focus;
focus = _;
return fisheye;
};
return rescale();
}
};
function d3_fisheye_scale(scale, d, a) {
function fisheye(_) {
var x = scale(_),
left = x < a,
range = d3.extent(scale.range()),
min = range[0],
max = range[1],
m = left ? a - min : max - a;
...