// 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.

Tool
Claude
Model
Opus 5
Type
Code
Date
Licence
Free to use, no conditions

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.