svg`<svg width="${w}" height="${h}">
<g transform="translate(${marginX}, ${marginY})">
${(() => {
return array(ny).map(i => {
const y = i * step
return array(nx).map(j => {
const x = j * step
const noise = simplex.noise3D(x/noiseScale, y/noiseScale, seed)
return `<polyline
opacity="0.6"
transform="translate(${x}, ${y}) rotate(${noise * 360})"
stroke="black"
points="${-strokeLength / 2},${0} ${strokeLength / 2},${0}"
/>`
}).join('\n')
}).join('\n')
})()}
</g>
</svg>`