{
let svgNode = DOM.svg(width*1, height*1);
let svg = d3.select(svgNode).style("background","#011a2a").attr("viewBox", [0, 0, width, height]);
for(var ii=0; ii<=300; ii++){
sim.tick();
}
var myline = d3.line()
.curve(d3.curveCardinalClosed.tension(0.1))
.x(d => d.x)
.y(d => d.y);
sim.on('end', function() {
let g = svg.selectAll('.group')
.data(dataset).enter()
.append('g')
.attr("class","group")
.attr("transform",d => "translate("+((d.y-height/2)*7.3+height/2)+","+(d.x*1.01+10)+")");
const discs = g.selectAll('.discs')
.data((d)=> {return d.r_vec
.map(rr => {
let ppp = d3.randomUniform(0,Math.PI*2)();
return (
{Voice: d.Voice,
PitchClass: d.PitchClass,
poly: d3.range(9)
.map(x => {
let pp = d3.randomUniform(0,0.05)();
return ({x: rr*Math.cos(2*Math.PI/9*x+pp+ppp),
y: rr*Math.sin(2*Math.PI/9*x+pp+ppp)})}),
r: rr})})})
.enter()
.append('path')
.attr("stroke","#011a2a")
.attr("stroke-opacity",0.993)
.attr("stroke-width",2.0)
.attr("fill",d => d3.scalePow()
.domain([0,90])
.range(["#012a4a",colorScale(d.PitchClass)])(d.r))
.attr("d",d => myline(d.poly))
.attr("class","discs")
.append("title").text(d=>d.Voice);
});
return svgNode;
}