svg`<svg width="${w}" height="${h}">
${throttle(
svg`<g transform="translate(${w/2}, ${h/2}) scale(1.1) translate(-${w/2}, -${h/2})">`,
polygons.map((p, i) => () => svg`<g>
${Polygon.fromPath(`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`).getHatches((simplex.noise3D(p.center.x/noiseScale, p.center.y/noiseScale, seed) * .5 + .5) * TAU * 2, map(simplex.noise3D(p.center.x/noiseScale, p.center.y/noiseScale, seed) * .5 + .5, 0, 1, 2, 10)).map(seg => `<line
stroke="black"
x1="${seg.a.x}"
y1="${seg.a.y}"
x2="${seg.b.x}"
y2="${seg.b.y}"
/>`)}
<path
fill="none"
stroke="black"
stroke-width="1"
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"
/></g>`))})}
</g>
</svg>`