svg`<svg width="${w}" height="${h}">
<defs>
${polygons.map((p, i) => {
const n = simplex.noise3D(p.center.x/noiseScale, p.center.y/noiseScale, seed) * .5 + .5
return `<pattern id="star${i}" viewBox="0,0,10,10" width="1" height="1">
<rect x="-20" y="-20" width="40" height="40" fill="${colorScale(0)}" stroke="none" />
<g transform="translate(5, 5) rotate(${n * 720})" >
${array((1-n) * 30 + 1 | 0).map((d,i,arr) => {
const x = map(i, 0, arr.length, -10, 10)
return `<line
x1="${x}"
y1="-10"
x2="${x}"
y2="10"
stroke="${colorScale(clamp(1-n, .1, 1))}"
stroke-width="${n * 2}"
/>`
})}
</g>
</pattern>`
}).join('\n')}
</defs>
<rect x="0" y="0" width="${w}" height="${h}" stroke="none" fill="${colorScale(0)}"></rect>
<g transform="translate(${w/2}, ${h/2}) scale(1.1) translate(-${w/2}, -${h/2})">
<!--
${polygons.map((p, i) => `<polygon
fill="url(#star${i})"
stroke="black"
stroke-width="0.5"
points="${p.pts.map(pt => `${pt.x} ${pt.y}`).join(' ')}"
/>`)}).join('\n')}
-->
${polygons.map((p, i) => `<path
fill="url(#star${i})"
stroke="${colorScale(0)}"
stroke-width="3.5"
stroke-linejoin="round"
d="M ${p.segments[0].center.x}, ${p.segments[0].center.y} ${p.segments.map((seg, i, arr) => `C ${seg.b.x} ${seg.b.y} ${seg.b.x} ${seg.b.y} ${arr[(i + 1) % arr.length].center.x} ${arr[(i + 1) % arr.length].center.y}`).join(' ')} Z"
/>`)}).join('\n')}
</g>
</svg>`