function limitBounds(b, maxWidth, maxHeight) { var w = b[1][0] - b[0][0]; if (w > maxWidth) { var c = (b[1][0] + b[0][0]) / 2; maxWidth /= 2; b[0][0] = c - maxWidth; b[1][0] = c + maxWidth; } var h = b[1][1] - b[0][1]; if (h > maxHeight) { var ch = (b[1][1] + b[0][1]) / 2; maxHeight /= 2; b[0][1] = ch - maxHeight; b[1][1] = ch + maxHeight; } } function visualBounds(path, feature) { if (feature._visualBounds) { return feature._visualBounds; } var bb = feature._bounds || (feature._bounds = path.bounds(feature)); var c = feature._centroid || (feature._centroid = path.centroid(feature)); var d = 0.366; var b = [[bb[0][0], bb[0][1]], [bb[1][0], bb[1][1]]]; var sx = d3.scale.linear().domain([b[0][0], b[1][0]]).range([0, 1]); var sy = d3.scale.linear().domain([b[0][1], b[1][1]]).range([0, 1]); if (Math.abs(0.5 - sx(c[0])) > d || Math.abs(0.5 - sy(c[1])) > d) { var h = Math.min(c[0] - b[0][0], b[1][0] - c[0], c[1] - b[0][1], b[1][1] - c[1]); b[0][0] = c[0] - h; b[1][0] = c[0] + h; b[0][1] = c[1] - h; b[1][1] = c[1] + h; } if (feature.id === 'AUS') { b[1][1] = d3.interpolate(b[0][1], b[1][1])(0.75); } else if (feature.id === 'USA') { b[1][0] = d3.interpolate(b[0][0], b[1][0])(0.28); } feature._visualBounds = b; return b; } function groupBounds(path, features, width, height, maxWidth, maxHeight) { var r = features.length ? [[[], []], [[], []]] : [[[0], [0]], [[width], [height]]]; features.forEach(function (feature) { var b = visualBounds(path, feature); //limitBounds(b, maxWidth, maxHeight); r[0][0].push(b[0][0]); r[0][1].push(b[0][1]); r[1][0].push(b[1][0]); r[1][1].push(b[1][1]); }); r[0][0] = Math.min.apply(this, r[0][0]); r[0][1] = Math.min.apply(this, r[0][1]); r[1][0] = Math.max.apply(this, r[1][0]); r[1][1] = Math.max.apply(this, r[1][1]); return r; } function getScale(size, width, height, scaleMargin, maxScale) { var marginSize = [(size[0] + width * scaleMargin * 2), (size[1] + width * scaleMargin * 2)]; var sizeRatio = marginSize[0] / marginSize[1]; var boxRatio = width / height; var r; if (sizeRatio >= boxRatio) { r = width / marginSize[0]; } else { r = height / marginSize[1]; } if (r < 1) { r = 1; } else if (r > maxScale) { r = maxScale; } return r; }