{
let stage = d3.select(DOM.svg(width, height))
stage.html(polygon.svg());
let data = [polygon];
let selection = stage.selectAll("*")
.data(data);
function zoom_action(){
selection.attr("stroke-width", 1/d3.event.transform.k);
selection.attr("transform", d3.event.transform);
}
let zoom_handler = d3.zoom()
.on("zoom", zoom_action);
stage.call(zoom_handler);
initial_transform(width, height, zoom_handler);
function initial_transform(canvasWidth, canvasHeight, zoom_handler) {
let box = new Flatten.Box();
selection.each( geom => box = box.merge(geom.box) )
let width = box.xmax - box.xmin;
let height = box.ymax - box.ymin;
let k = Math.min( canvasWidth / (1.1*width), canvasHeight / (1.1*height) );
let tx = canvasWidth/2 - k*(box.xmin + box.xmax)/2;
let ty = canvasHeight/2 - k*(box.ymin + box.ymax)/2;
let t = d3.zoomIdentity.translate(tx, ty).scale(k, -k);
stage.transition().duration(1000).call(zoom_handler.transform, t);
}
return stage.node()
}