// Pianta di una città che non esiste. Restituisce SVG come stringa.
const rnd = (s => () => (s = Math.imul(s ^ (s >>> 15), s | 1), ((s ^= s + Math.imul(s ^ (s >>> 7), s | 61)) >>> 0) / 2 ** 32))(20261021);
function citta(lato = 600) {
const c = lato / 2, raggio = lato * 0.37;
const lati = 11 + Math.floor(rnd() * 5);
// cinta muraria: un poligono irregolare, perché nessuna città è un cerchio
const mura = Array.from({ length: lati }, (_, i) => {
const a = (i / lati) * Math.PI * 2;
const d = raggio * (0.82 + rnd() * 0.3);
return [c + Math.cos(a) * d, c + Math.sin(a) * d];
});
// il fiume entra da un lato ed esce dall'altro, mai dritto
const fiume = `M -20 ${c + (rnd() - .5) * lato * .3}
C ${lato * .3} ${c + (rnd() - .5) * lato * .5},
${lato * .7} ${c + (rnd() - .5) * lato * .5},
${lato + 20} ${c + (rnd() - .5) * lato * .3}`;
// le strade convergono sulla piazza: è così che si riconosce un centro
const piazza = [c + (rnd() - .5) * 60, c + (rnd() - .5) * 60];
const strade = mura.filter((_, i) => i % 2 === 0)
.map(p => `M ${p[0]} ${p[1]} Q ${(p[0] + piazza[0]) / 2 + (rnd() - .5) * 70} ${(p[1] + piazza[1]) / 2 + (rnd() - .5) * 70} ${piazza[0]} ${piazza[1]}`);
return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${lato} ${lato}">
<rect width="${lato}" height="${lato}" fill="#f3efe4"/>
<path d="${fiume}" fill="none" stroke="#9db7c4" stroke-width="13" stroke-linecap="round"/>
${strade.map(d => `<path d="${d}" fill="none" stroke="#c9bfa8" stroke-width="2.5"/>`).join("")}
<polygon points="${mura.map(p => p.join(",")).join(" ")}" fill="none" stroke="#5b5243" stroke-width="4"/>
<circle cx="${piazza[0]}" cy="${piazza[1]}" r="16" fill="#e6dcc4" stroke="#5b5243" stroke-width="2"/>
</svg>`;
}Pianta di una città che non esiste
Un generatore di mappe urbane: mura, fiume, quartieri e una piazza dove le strade si incontrano. Dalla collezione di apertura.
Prompt
Scrivi un generatore in JavaScript che produce la pianta di una città medievale inventata: cinta muraria irregolare, un fiume che la attraversa, strade che convergono su una piazza. Output SVG, nessuna dipendenza.