svg`<svg width="${w}" height="${h}">
<rect x="0" y="0" width="${w}" height="${h}" stroke="none" fill="black"></rect>
<g>
${(() => {
const points = new PoissonDiskSampling({
shape: [w, h],
minDistance: 5,
maxDistance: 15,
tries: 10
}).fill()
return points.map((d, i) => {
const pos = PVector(...d)
const noise = simplex.noise3D(pos.x/noiseScale, pos.y/noiseScale, seed)
return `<circle
cx="${pos.x}"
cy="${pos.y}"
r="${noise * 50 + 30}"
stroke="${colorScale(noise)}"
opacity="0.5"
fill="none"
/>`
}).join('\n')
})()}
</g>
</svg>`