svg`<svg width="${w}" height="${h}">
${(() => {
const margin = 10
const walls = [
new Segment(PVector(-margin, -margin), PVector(w + margin, -margin)),
new Segment(PVector(w + margin, -margin), PVector(w + margin, h + margin)),
new Segment(PVector(w + margin, h + margin), PVector(-margin, h + margin)),
new Segment(PVector(-margin, h + margin), PVector(-margin, -margin))
]
const segments = []
const A = PVector(w, h)
const s = new Segment(A, PVector.add(A, PVector.fromAngle(random(-PI, -3*PI/4)).setMag(segLength)))
segments.push(s)
while (segments.length < N) {
const index = expRand(0, 1, 0.5) * (segments.length-1) | 0
const prevSeg = segments[index]
const A = prevSeg.pointAt(random())
const l = map(segments.length, 0, N, segLength, 10)
const currSeg = new Segment(A, PVector.add(A, PVector.sub(prevSeg.b, prevSeg.a).setMag(l).rotateBy(random(-deltaAngle, deltaAngle))))
const isPtOut = a => (a.x < 0 || a.x > w) && (a.y < 0 || a.y > h);
const isSegOut = s => isPtOut(s.a) && isPtOut(s.b)
if(!isSegOut(currSeg) && !walls.find(w => segSegIntersection(w, currSeg)) && !segments.filter((seg, i) => i !== index).find(s => segSegIntersection(s, currSeg))) {
segments.push(currSeg)
}
}
return segments.map((seg, i) => `<line
opacity="0.5"
stroke="black"
stroke="hsl(${map(seg.getLength(), 10, segLength, 0, 360)},50%,50%)"
x1="${seg.a.x}" y1="${seg.a.y}"
x2="${seg.b.x}" y2="${seg.b.y}"
/>`).join('\n')
})()}
</svg>`