graphic = {
const svg = d3.create("svg")
.attr("viewBox", [-0.53, -0.53, 1.06, 1.06])
.attr("stroke", "black")
.attr("stroke-width", 1 / 640)
.style("max-width", "640px")
.style("display", "block")
.style("margin", "auto");
const frame = svg.append("g");
const path = frame.selectAll("path")
.data(gears)
.join("path")
.attr("fill", d => d.fill)
.attr("d", gear);
return Object.assign(svg.node(), {
update(angle, frameAngle) {
path.attr("transform", d => `translate(${d.origin}) rotate(${(angle / d.radius) % 360})`);
frame.attr("transform", `rotate(${frameAngle % 360})`);
}
});
}