<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Simulatore Volo Aeroplani di Carta</title>
<style>
  :root {
    --bg: #0f1419;
    --panel: #1a2230;
    --panel-2: #232d3d;
    --accent: #4dc4ff;
    --accent-2: #ffb86b;
    --text: #e6edf3;
    --muted: #8b98a8;
    --good: #4ade80;
    --bad: #f87171;
    --border: #2a3548;
  }
  * { box-sizing: border-box; }
  html, body {
    margin: 0; padding: 0;
    background: var(--bg);
    color: var(--text);
    font-family: -apple-system, "Segoe UI", Roboto, sans-serif;
    height: 100%;
    overflow: hidden;
  }
  .app {
    display: grid;
    grid-template-columns: 320px 1fr;
    height: 100vh;
  }
  .sidebar {
    background: var(--panel);
    border-right: 1px solid var(--border);
    padding: 16px;
    overflow-y: auto;
  }
  .sidebar h1 {
    font-size: 16px;
    margin: 0 0 4px 0;
    color: var(--accent);
  }
  .sidebar .sub {
    font-size: 11px;
    color: var(--muted);
    margin-bottom: 18px;
  }
  .group {
    background: var(--panel-2);
    border: 1px solid var(--border);
    border-radius: 8px;
    padding: 12px;
    margin-bottom: 12px;
  }
  .group h2 {
    font-size: 11px;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--muted);
    margin: 0 0 10px 0;
    font-weight: 600;
  }
  .field {
    margin-bottom: 10px;
  }
  .field:last-child { margin-bottom: 0; }
  .field label {
    display: flex;
    justify-content: space-between;
    font-size: 12px;
    margin-bottom: 4px;
  }
  .field label .v {
    color: var(--accent);
    font-variant-numeric: tabular-nums;
  }
  .field input[type=range] {
    width: 100%;
    accent-color: var(--accent);
  }
  .field select {
    width: 100%;
    background: var(--panel);
    color: var(--text);
    border: 1px solid var(--border);
    border-radius: 4px;
    padding: 6px;
    font-size: 12px;
  }
  .btns {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 8px;
  }
  button {
    background: var(--accent);
    color: #052236;
    border: none;
    padding: 9px;
    border-radius: 6px;
    font-weight: 600;
    cursor: pointer;
    font-size: 13px;
  }
  button.sec {
    background: var(--panel);
    color: var(--text);
    border: 1px solid var(--border);
  }
  button:hover { filter: brightness(1.1); }
  .stage {
    position: relative;
    overflow: hidden;
  }
  canvas#sky {
    display: block;
    width: 100%;
    height: 100%;
  }
  .hud {
    position: absolute;
    top: 12px;
    left: 12px;
    background: rgba(15,20,25,0.78);
    border: 1px solid var(--border);
    border-radius: 8px;
    padding: 10px 14px;
    font-size: 12px;
    font-variant-numeric: tabular-nums;
    min-width: 200px;
    backdrop-filter: blur(6px);
  }
  .hud .row {
    display: flex;
    justify-content: space-between;
    margin: 3px 0;
  }
  .hud .row span:first-child { color: var(--muted); }
  .hud .row span:last-child { color: var(--text); }
  .hud .row.warn span:last-child { color: var(--bad); }
  .hud .row.ok span:last-child { color: var(--good); }
  .legend {
    position: absolute;
    top: 12px;
    right: 12px;
    background: rgba(15,20,25,0.78);
    border: 1px solid var(--border);
    border-radius: 8px;
    padding: 10px 12px;
    font-size: 11px;
    backdrop-filter: blur(6px);
  }
  .legend .item { display: flex; align-items: center; gap: 8px; margin: 3px 0; }
  .legend .swatch { width: 18px; height: 3px; border-radius: 2px; }
  .footer {
    font-size: 10px;
    color: var(--muted);
    text-align: center;
    margin-top: 12px;
    line-height: 1.5;
  }
  @media (max-width: 760px) {
    .app { grid-template-columns: 1fr; grid-template-rows: auto 1fr; }
    .sidebar { max-height: 45vh; }
  }

  /* Tooltip per parametri */
  .tip {
    position: relative;
    cursor: help;
    border-bottom: 1px dotted var(--muted);
  }
  .tip:hover::after,
  .tip:focus::after {
    content: attr(data-tip);
    position: absolute;
    bottom: calc(100% + 6px);
    left: 0;
    background: #0d1420;
    border: 1px solid var(--accent);
    padding: 8px 10px;
    border-radius: 6px;
    font-size: 11px;
    color: var(--text);
    width: 240px;
    z-index: 50;
    pointer-events: none;
    white-space: normal;
    line-height: 1.45;
    box-shadow: 0 4px 14px rgba(0,0,0,0.4);
  }
  .tip:hover::before {
    content: '';
    position: absolute;
    bottom: 100%;
    left: 14px;
    border: 5px solid transparent;
    border-top-color: var(--accent);
    z-index: 51;
  }
  .layout-wrap {
    position: relative;
    cursor: zoom-in;
  }
  .layout-hint {
    position: absolute;
    right: 6px;
    bottom: 6px;
    background: rgba(77,196,255,0.12);
    color: var(--accent);
    font-size: 9px;
    padding: 2px 6px;
    border-radius: 3px;
    border: 1px solid rgba(77,196,255,0.4);
    pointer-events: none;
  }

  /* Modal anatomia */
  .modal {
    position: fixed;
    inset: 0;
    z-index: 2147483000;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 20px;
  }
  .modal.hidden { display: none; }
  .modal-backdrop {
    position: absolute; inset: 0;
    background: rgba(0,0,0,0.7);
    backdrop-filter: blur(4px);
  }
  .modal-content {
    position: relative;
    background: var(--panel);
    border: 1px solid var(--border);
    border-radius: 10px;
    max-width: 880px;
    width: 100%;
    max-height: 92vh;
    overflow: auto;
    padding: 20px 24px;
    box-shadow: 0 20px 60px rgba(0,0,0,0.5);
  }
  .modal-content h2 {
    margin: 0 0 4px 0;
    font-size: 18px;
    color: var(--accent);
  }
  .modal-content .modal-sub {
    color: var(--muted);
    font-size: 12px;
    margin-bottom: 14px;
  }
  .modal-close {
    position: absolute;
    top: 10px; right: 12px;
    background: transparent;
    color: var(--muted);
    border: none;
    font-size: 26px;
    line-height: 1;
    cursor: pointer;
    padding: 4px 10px;
    border-radius: 4px;
  }
  .modal-close:hover { color: var(--text); background: var(--panel-2); }
  #bigLayout {
    width: 100%;
    height: auto;
    background: #0d1420;
    border-radius: 8px;
    border: 1px solid var(--border);
    display: block;
  }
  .anatomy-legend {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
    gap: 10px;
    margin-top: 14px;
  }
  .anatomy-legend .a {
    background: var(--panel-2);
    border: 1px solid var(--border);
    border-radius: 6px;
    padding: 10px 12px;
    font-size: 12px;
    line-height: 1.45;
  }
  .anatomy-legend .a b { color: var(--accent); }
  .anatomy-legend .a .dot {
    display: inline-block;
    width: 10px; height: 10px;
    border-radius: 50%;
    margin-right: 6px;
    vertical-align: middle;
  }
</style>
</head>
<body>
<div class="app">
  <aside class="sidebar">
    <h1>Simulatore Aeroplani di Carta</h1>
    <div class="sub">Modello fisico 2D con portanza, resistenza, stallo e momento di beccheggio.</div>

    <div class="group">
      <h2>Modello</h2>
      <div class="field">
        <select id="preset">
          <optgroup label="Velocità">
            <option value="dart">Dart — freccia veloce</option>
            <option value="stealth">Stealth — Nakamura lock</option>
          </optgroup>
          <optgroup label="Planata">
            <option value="glider" selected>Aliante classico</option>
            <option value="longrange">Lunga distanza</option>
            <option value="wide">Ali larghe — molto lento</option>
          </optgroup>
          <optgroup label="Acrobatico">
            <option value="stunt">Stunt — looping</option>
            <option value="hoop">Hoop wing — anulare</option>
          </optgroup>
          <optgroup label="Particolare">
            <option value="heavy">Cartoncino pesante</option>
          </optgroup>
        </select>
      </div>
      <div class="layout-wrap" id="layout_wrap" title="Clicca per vedere l'anatomia dell'aereo">
        <canvas id="layout" width="380" height="240" style="width:100%; height:auto; background:#0d1420; border-radius:6px; margin-top:8px; border:1px solid var(--border); display:block;"></canvas>
        <span class="layout-hint">clicca per dettagli ⤢</span>
      </div>
      <div id="layout_info" style="font-size:10px; color:var(--muted); margin-top:6px; line-height:1.5;"></div>
    </div>

    <div class="group">
      <h2>Lancio</h2>
      <div class="field">
        <label><span class="tip" data-tip="Velocità con cui l'aereo lascia la mano. Più alta → più gittata ma anche più resistenza aerodinamica (∝v²). Tipico: 5–12 m/s.">Velocità iniziale</span> <span class="v"><span id="v_v0">7.0</span> m/s</span></label>
        <input type="range" id="v0" min="2" max="20" step="0.1" value="7" />
      </div>
      <div class="field">
        <label><span class="tip" data-tip="Inclinazione del vettore velocità rispetto all'orizzonte al momento del lancio. Angoli alti = traiettoria a campana; angoli bassi = lancio teso.">Angolo lancio</span> <span class="v"><span id="v_ang">10</span>°</span></label>
        <input type="range" id="ang" min="-20" max="60" step="1" value="10" />
      </div>
      <div class="field">
        <label><span class="tip" data-tip="Altezza iniziale dal suolo. Determina quanto tempo l'aereo ha per planare prima di toccare terra.">Quota lancio</span> <span class="v"><span id="v_h0">2.0</span> m</span></label>
        <input type="range" id="h0" min="0.5" max="10" step="0.1" value="2" />
      </div>
    </div>

    <div class="group">
      <h2>Aeroplano</h2>
      <div class="field">
        <label><span class="tip" data-tip="Peso dell'aereo. Una massa maggiore aumenta l'inerzia (più stabile al vento) ma richiede più portanza per sostenersi: la velocità di stallo aumenta con √m.">Massa</span> <span class="v"><span id="v_m">5.0</span> g</span></label>
        <input type="range" id="m" min="2" max="20" step="0.1" value="5" />
      </div>
      <div class="field">
        <label><span class="tip" data-tip="Area totale delle ali viste dall'alto. Compare in L = ½ρv²S·CL: più superficie → più portanza ma anche più resistenza. Tipico per A4: 0.02–0.06 m².">Superficie alare</span> <span class="v"><span id="v_s">0.030</span> m²</span></label>
        <input type="range" id="s" min="0.005" max="0.08" step="0.001" value="0.030" />
      </div>
      <div class="field">
        <label><span class="tip" data-tip="Distanza dal bordo d'attacco al bordo d'uscita dell'ala (lunghezza nella direzione di volo). Definisce la scala del momento di beccheggio M = qSc·Cm.">Corda media</span> <span class="v"><span id="v_c">0.15</span> m</span></label>
        <input type="range" id="c" min="0.05" max="0.30" step="0.005" value="0.15" />
      </div>
      <div class="field">
        <label><span class="tip" data-tip="Distanza relativa tra Centro di Gravità (CoG) e Centro di Pressione (CP), in frazioni di corda. SM > 0: CoG davanti al CP → stabile (autoriaprende l'assetto). SM = 0: neutro. SM < 0: instabile (diverge).">Margine statico</span> <span class="v"><span id="v_sm">0.10</span></span></label>
        <input type="range" id="sm" min="-0.05" max="0.30" step="0.01" value="0.10" />
      </div>
      <div class="field">
        <label><span class="tip" data-tip="Piccola deflessione (es. alettoni di coda) che sposta l'angolo d'attacco di equilibrio. Positivo = cabra (naso su), negativo = picchia. Usato per regolare la planata.">Trim (cabra/picchia)</span> <span class="v"><span id="v_trim">0</span>°</span></label>
        <input type="range" id="trim" min="-10" max="10" step="0.5" value="0" />
      </div>
    </div>

    <div class="group">
      <h2>Ambiente</h2>
      <div class="field">
        <label><span class="tip" data-tip="Velocità del vento costante (positivo = a favore, negativo = contro). Modifica la velocità relativa all'aria: vento contrario aumenta la portanza ma riduce la gittata al suolo.">Vento orizzontale</span> <span class="v"><span id="v_wind">0.0</span> m/s</span></label>
        <input type="range" id="wind" min="-5" max="5" step="0.1" value="0" />
      </div>
    </div>

    <div class="btns">
      <button id="launch">▶ Lancia</button>
      <button id="reset" class="sec">↻ Reset</button>
    </div>
    <div class="footer">
      Equazioni: L = ½ρv²S·C<sub>L</sub>(α), D = ½ρv²S·C<sub>D</sub>(α),<br>
      M = qS·c·(C<sub>m0</sub> − SM·C<sub>L</sub>) − k<sub>q</sub>·ω.<br>
      Integratore RK4, Δt = 2 ms.
    </div>
  </aside>

  <main class="stage">
    <canvas id="sky"></canvas>
    <div class="hud">
      <div class="row"><span>Tempo</span><span id="hud_t">0.00 s</span></div>
      <div class="row"><span>Velocità</span><span id="hud_v">0.0 m/s</span></div>
      <div class="row"><span>Quota</span><span id="hud_h">0.0 m</span></div>
      <div class="row"><span>Distanza</span><span id="hud_x">0.0 m</span></div>
      <div class="row"><span>Angolo attacco α</span><span id="hud_a">0°</span></div>
      <div class="row"><span>Assetto θ</span><span id="hud_th">0°</span></div>
      <div class="row" id="hud_stall_row"><span>Stato</span><span id="hud_stall">—</span></div>
    </div>
    <div class="legend">
      <div class="item"><div class="swatch" style="background:#4dc4ff"></div>Traiettoria</div>
      <div class="item"><div class="swatch" style="background:#4ade80"></div>Portanza (L)</div>
      <div class="item"><div class="swatch" style="background:#f87171"></div>Resistenza (D)</div>
      <div class="item"><div class="swatch" style="background:#ffb86b"></div>Velocità (V)</div>
    </div>
  </main>
</div>

<div id="modal" class="modal hidden" role="dialog" aria-modal="true" aria-labelledby="modal_title">
  <div class="modal-backdrop" data-close></div>
  <div class="modal-content">
    <button class="modal-close" data-close aria-label="Chiudi">×</button>
    <h2 id="modal_title">Anatomia dell'aereo</h2>
    <div class="modal-sub" id="modal_sub">Vista dall'alto con i punti aerodinamici chiave.</div>
    <canvas id="bigLayout" width="820" height="460"></canvas>
    <div class="anatomy-legend">
      <div class="a"><span class="dot" style="background:#ffb86b"></span><b>CoG — Centro di gravità</b><br>Punto in cui si concentra il peso. Si sposta in avanti aggiungendo carta nel naso (graffette, pieghe). Determina la stabilità statica.</div>
      <div class="a"><span class="dot" style="background:#4dc4ff"></span><b>CP — Centro di pressione</b><br>Punto di applicazione della risultante aerodinamica (portanza + resistenza). Per una piastra sottile è circa al 25% della corda dal bordo d'attacco.</div>
      <div class="a"><span class="dot" style="background:#4ade80"></span><b>SM — Margine statico</b><br>Distanza CoG↔CP normalizzata sulla corda. Se CoG è davanti al CP la portanza genera un momento picchiante che riporta l'aereo all'equilibrio → volo stabile.</div>
      <div class="a"><span class="dot" style="background:#e6edf3"></span><b>Corda (c)</b><br>Lunghezza dell'ala nella direzione di volo, dal bordo d'attacco a quello d'uscita. Scala il momento di beccheggio.</div>
      <div class="a"><span class="dot" style="background:#e6edf3"></span><b>Apertura alare (b)</b><br>Distanza tra le due estremità delle ali. Aspect ratio AR = b²/S: alto → maggiore efficienza (planata).</div>
      <div class="a"><span class="dot" style="background:#f87171"></span><b>Bordo d'attacco / d'uscita</b><br>Il bordo d'attacco fende l'aria; quello d'uscita è dove i filetti d'aria si ricongiungono. La differenza di pressione tra dorso e ventre genera la portanza.</div>
    </div>
  </div>
</div>

<script>
(() => {
  // ---------- Physics ----------
  const RHO = 1.225;          // kg/m³ aria
  const G   = 9.81;           // m/s²
  const DT  = 0.002;          // s, passo integrazione

  // Coefficienti aerodinamici per piastra sottile con stallo
  function CL(alpha) {
    const aDeg = alpha * 180 / Math.PI;
    const stall = 14; // gradi
    const slope = 2 * Math.PI; // per radiante (teoria piastra sottile)
    if (Math.abs(aDeg) <= stall) {
      return slope * alpha;
    }
    // Post-stallo: transizione a piastra piana (flat plate)
    const sign = Math.sign(alpha);
    const aAbs = Math.abs(alpha);
    const aStallRad = stall * Math.PI / 180;
    const clStall = slope * aStallRad;
    const clPlate = 2 * Math.sin(aAbs) * Math.cos(aAbs);
    // mescolanza per fluidità
    const blendEnd = 35 * Math.PI / 180;
    if (aAbs < blendEnd) {
      const t = (aAbs - aStallRad) / (blendEnd - aStallRad);
      // drop bruschetto al limite poi piastra
      const clDrop = clStall * 0.75;
      const clMid  = clDrop + (clPlate - clDrop) * t;
      return sign * clMid;
    }
    return sign * clPlate;
  }

  function CD(alpha, cl) {
    const CD0 = 0.04;       // resistenza parassita
    const k   = 0.12;       // fattore induzione
    const aAbs = Math.abs(alpha);
    const stallRad = 14 * Math.PI / 180;
    let extra = 0;
    if (aAbs > stallRad) {
      // resistenza piastra piana cresce con sin²
      extra = 1.8 * Math.sin(alpha) * Math.sin(alpha);
    }
    return CD0 + k * cl * cl + extra;
  }

  // Stato simulazione
  let state = null;
  let traj = [];
  let running = false;
  let crashed = false;
  let crashedReason = "";
  let simAccumulator = 0;
  let lastFrame = 0;

  // Parametri (aggiornati da UI)
  const P = {
    v0: 7, ang: 10, h0: 2,
    m: 0.005, S: 0.030, c: 0.15,
    SM: 0.10, trim: 0,
    wind: 0,
    Cm0: 0.02,   // coefficiente di momento a portanza nulla (piccolo positivo = cabra)
    kq: 0.6,     // smorzamento angolare (per area * corda)
    I: null      // momento d'inerzia, calcolato
  };

  function computeInertia() {
    // approssimazione: piastra rettangolare di corda c, span ~ S/c
    const span = P.S / P.c;
    // I ≈ (1/12) m (c² + span²) per rotazione attorno asse di beccheggio (asse trasversale)
    // ma per beccheggio l'asse è lungo lo span: I = (1/12) m c²
    P.I = (1/12) * P.m * P.c * P.c;
  }

  function reset() {
    running = false;
    crashed = false;
    crashedReason = "";
    const angRad = P.ang * Math.PI / 180;
    state = {
      x: 0,
      y: P.h0,
      vx: P.v0 * Math.cos(angRad),
      vy: P.v0 * Math.sin(angRad),
      th: angRad,    // assetto iniziale = direzione lancio
      om: 0          // velocità angolare
    };
    traj = [{x: state.x, y: state.y}];
    computeInertia();
    updateHUD();
    draw();
  }

  function derivatives(s) {
    // velocità relativa all'aria
    const vxa = s.vx - P.wind;
    const vya = s.vy;
    const V2 = vxa*vxa + vya*vya;
    const V = Math.sqrt(V2);

    let alpha = 0, cl = 0, cd = 0, L = 0, D = 0, M = 0;
    let ax = 0, ay = -G, aom = 0;

    if (V > 0.01) {
      const gamma = Math.atan2(vya, vxa);  // angolo traiettoria rispetto all'aria
      alpha = s.th - gamma + P.trim * Math.PI / 180;
      // normalizza
      while (alpha >  Math.PI) alpha -= 2*Math.PI;
      while (alpha < -Math.PI) alpha += 2*Math.PI;

      cl = CL(alpha);
      cd = CD(alpha, cl);
      const q = 0.5 * RHO * V2;
      L = q * P.S * cl;
      D = q * P.S * cd;

      // direzione drag = -velocità relativa, lift perpendicolare (verso l'alto rispetto a γ)
      const cosG = vxa / V, sinG = vya / V;
      const Fx = -D * cosG - L * sinG;
      const Fy = -D * sinG + L * cosG;

      ax = Fx / P.m;
      ay = Fy / P.m - G;

      // momento di beccheggio: Cm = Cm0 - SM * CL  (stabilità statica)
      const Cm = P.Cm0 - P.SM * cl;
      const Maero = q * P.S * P.c * Cm;
      // smorzamento aerodinamico (pitch damping): -kq * (ρ V S c²) * ω / 2
      const Mdamp = -P.kq * 0.5 * RHO * V * P.S * P.c * P.c * s.om;
      M = Maero + Mdamp;
      aom = M / P.I;
    }

    return {
      dx: s.vx, dy: s.vy,
      dvx: ax, dvy: ay,
      dth: s.om, dom: aom,
      _diag: { alpha, V, L, D, cl, cd }
    };
  }

  function stepRK4(s, dt) {
    const add = (s, k, h) => ({
      x: s.x + k.dx*h, y: s.y + k.dy*h,
      vx: s.vx + k.dvx*h, vy: s.vy + k.dvy*h,
      th: s.th + k.dth*h, om: s.om + k.dom*h
    });
    const k1 = derivatives(s);
    const k2 = derivatives(add(s, k1, dt/2));
    const k3 = derivatives(add(s, k2, dt/2));
    const k4 = derivatives(add(s, k3, dt));
    return {
      x:  s.x  + dt/6 * (k1.dx  + 2*k2.dx  + 2*k3.dx  + k4.dx),
      y:  s.y  + dt/6 * (k1.dy  + 2*k2.dy  + 2*k3.dy  + k4.dy),
      vx: s.vx + dt/6 * (k1.dvx + 2*k2.dvx + 2*k3.dvx + k4.dvx),
      vy: s.vy + dt/6 * (k1.dvy + 2*k2.dvy + 2*k3.dvy + k4.dvy),
      th: s.th + dt/6 * (k1.dth + 2*k2.dth + 2*k3.dth + k4.dth),
      om: s.om + dt/6 * (k1.dom + 2*k2.dom + 2*k3.dom + k4.dom),
      _last: k1._diag
    };
  }

  // ---------- Rendering ----------
  const canvas = document.getElementById('sky');
  const ctx = canvas.getContext('2d');
  let W = 0, H = 0, DPR = window.devicePixelRatio || 1;

  function resize() {
    DPR = window.devicePixelRatio || 1;
    const r = canvas.getBoundingClientRect();
    W = r.width; H = r.height;
    canvas.width  = Math.floor(W * DPR);
    canvas.height = Math.floor(H * DPR);
    ctx.setTransform(DPR, 0, 0, DPR, 0, 0);
    draw();
  }
  window.addEventListener('resize', resize);

  // World-to-screen: ground at y=0, camera segue l'aereo orizzontalmente
  function worldView() {
    const leftMargin = 30; // px: il lancio parte a 30px dal bordo sinistro
    const viewW = 22; // metri visibili in orizzontale
    const bottomMargin = 60; // px per il terreno
    const pxPerM_x = (W - leftMargin) / viewW;
    const viewH = (H - bottomMargin) / pxPerM_x;
    let camX = state ? Math.max(viewW/3, state.x) - viewW/3 : 0;
    const groundY = H - bottomMargin;
    function w2s(x, y) {
      return {
        sx: leftMargin + (x - camX) * pxPerM_x,
        sy: groundY - y * pxPerM_x
      };
    }
    return { w2s, pxPerM: pxPerM_x, groundY, viewW, viewH, camX, leftMargin };
  }

  function drawBackground(view) {
    // cielo gradiente
    const g = ctx.createLinearGradient(0, 0, 0, H);
    g.addColorStop(0, '#1a3550');
    g.addColorStop(0.7, '#2a5275');
    g.addColorStop(1, '#3a6a8e');
    ctx.fillStyle = g;
    ctx.fillRect(0, 0, W, H);

    // nuvole stilizzate
    ctx.fillStyle = 'rgba(255,255,255,0.06)';
    for (let i = 0; i < 6; i++) {
      const cx = ((i * 137 - view.camX * 8) % (W + 200)) - 100;
      const cy = 40 + (i * 53) % 80;
      ctx.beginPath();
      ctx.ellipse(cx, cy, 60, 14, 0, 0, Math.PI*2);
      ctx.fill();
    }

    // griglia metrica
    ctx.strokeStyle = 'rgba(255,255,255,0.05)';
    ctx.lineWidth = 1;
    const startX = Math.floor(view.camX);
    for (let x = startX; x < view.camX + view.viewW + 1; x++) {
      const p = view.w2s(x, 0);
      ctx.beginPath();
      ctx.moveTo(p.sx, 0);
      ctx.lineTo(p.sx, view.groundY);
      ctx.stroke();
    }
    for (let y = 0; y < view.viewH; y += 2) {
      const p = view.w2s(0, y);
      ctx.beginPath();
      ctx.moveTo(0, p.sy);
      ctx.lineTo(W, p.sy);
      ctx.stroke();
    }

    // terra
    ctx.fillStyle = '#3a4a3a';
    ctx.fillRect(0, view.groundY, W, H - view.groundY);
    ctx.fillStyle = '#4a5a3a';
    ctx.fillRect(0, view.groundY, W, 4);

    // etichetta metri
    ctx.fillStyle = 'rgba(255,255,255,0.35)';
    ctx.font = '10px sans-serif';
    for (let x = startX; x < view.camX + view.viewW + 1; x += 5) {
      const p = view.w2s(x, 0);
      ctx.fillText(x + ' m', p.sx + 2, view.groundY - 2);
    }
  }

  function drawTrajectory(view) {
    if (traj.length < 2) return;
    ctx.strokeStyle = 'rgba(77,196,255,0.7)';
    ctx.lineWidth = 1.5;
    ctx.beginPath();
    const p0 = view.w2s(traj[0].x, traj[0].y);
    ctx.moveTo(p0.sx, p0.sy);
    for (let i = 1; i < traj.length; i++) {
      const p = view.w2s(traj[i].x, traj[i].y);
      ctx.lineTo(p.sx, p.sy);
    }
    ctx.stroke();
  }

  function drawPlane(view) {
    if (!state) return;
    const p = view.w2s(state.x, state.y);
    const scale = view.pxPerM * P.c * 1.5; // l'aereo visivo è ~1.5x la corda
    ctx.save();
    ctx.translate(p.sx, p.sy);
    ctx.rotate(-state.th); // canvas Y-down

    // corpo aereo (vista laterale: triangolo allungato)
    ctx.fillStyle = '#f5f5f5';
    ctx.strokeStyle = '#cfd8dc';
    ctx.lineWidth = 1;
    ctx.beginPath();
    ctx.moveTo( scale,        0);
    ctx.lineTo(-scale*0.7,  scale*0.18);
    ctx.lineTo(-scale*0.5,  0);
    ctx.lineTo(-scale*0.7, -scale*0.18);
    ctx.closePath();
    ctx.fill();
    ctx.stroke();
    // piega centrale
    ctx.strokeStyle = '#90a4ae';
    ctx.beginPath();
    ctx.moveTo( scale,       0);
    ctx.lineTo(-scale*0.5,   0);
    ctx.stroke();

    ctx.restore();

    // vettori forze
    if (state._last && !crashed) {
      const d = state._last;
      const V = d.V;
      const gamma = Math.atan2(state.vy - 0, state.vx - P.wind);

      // velocità (arancione)
      drawArrow(p.sx, p.sy, Math.cos(gamma), -Math.sin(gamma), V * 4, '#ffb86b');
      // lift (verde) perpendicolare a velocità relativa, verso "su" (rispetto traiettoria)
      const liftScale = Math.abs(d.L) * 800;
      const sgnL = Math.sign(d.L) || 1;
      drawArrow(p.sx, p.sy, -Math.sin(gamma)*sgnL, -Math.cos(gamma)*sgnL, liftScale, '#4ade80');
      // drag (rosso) opposto alla velocità
      const dragScale = d.D * 800;
      drawArrow(p.sx, p.sy, -Math.cos(gamma), Math.sin(gamma), dragScale, '#f87171');
    }
  }

  function drawArrow(x, y, dx, dy, len, color) {
    len = Math.min(len, 90);
    if (len < 4) return;
    const ex = x + dx*len, ey = y + dy*len;
    ctx.strokeStyle = color;
    ctx.fillStyle = color;
    ctx.lineWidth = 2;
    ctx.beginPath();
    ctx.moveTo(x, y);
    ctx.lineTo(ex, ey);
    ctx.stroke();
    // punta freccia
    const ang = Math.atan2(dy, dx);
    ctx.beginPath();
    ctx.moveTo(ex, ey);
    ctx.lineTo(ex - 7*Math.cos(ang - 0.4), ey - 7*Math.sin(ang - 0.4));
    ctx.lineTo(ex - 7*Math.cos(ang + 0.4), ey - 7*Math.sin(ang + 0.4));
    ctx.closePath();
    ctx.fill();
  }

  function draw() {
    const view = worldView();
    drawBackground(view);
    drawTrajectory(view);
    drawPlane(view);
  }

  // ---------- Loop ----------
  let simTime = 0;
  function loop(ts) {
    if (!lastFrame) lastFrame = ts;
    const dt = Math.min(0.05, (ts - lastFrame) / 1000);
    lastFrame = ts;

    if (running && !crashed) {
      simAccumulator += dt;
      while (simAccumulator >= DT) {
        state = stepRK4(state, DT);
        simAccumulator -= DT;
        simTime += DT;

        // sample traiettoria
        const last = traj[traj.length-1];
        if (!last || Math.hypot(state.x - last.x, state.y - last.y) > 0.05) {
          traj.push({x: state.x, y: state.y});
          if (traj.length > 4000) traj.shift();
        }

        // stop conditions
        if (state.y <= 0) {
          state.y = 0;
          running = false;
          crashed = true;
          crashedReason = state.vy < -3 ? "Impatto duro" : "Atterrato";
          break;
        }
        if (state.x > 200 || state.x < -50 || state.y > 80) {
          running = false;
          crashed = true;
          crashedReason = "Fuori scena";
          break;
        }
      }
      updateHUD();
    }
    draw();
    requestAnimationFrame(loop);
  }

  // ---------- HUD ----------
  function updateHUD() {
    if (!state) return;
    const V = Math.hypot(state.vx, state.vy);
    document.getElementById('hud_t').textContent = simTime.toFixed(2) + ' s';
    document.getElementById('hud_v').textContent = V.toFixed(1) + ' m/s';
    document.getElementById('hud_h').textContent = state.y.toFixed(1) + ' m';
    document.getElementById('hud_x').textContent = state.x.toFixed(1) + ' m';
    const alpha = state._last ? state._last.alpha * 180/Math.PI : 0;
    document.getElementById('hud_a').textContent = alpha.toFixed(1) + '°';
    document.getElementById('hud_th').textContent = (state.th * 180/Math.PI).toFixed(1) + '°';
    const row = document.getElementById('hud_stall_row');
    const cell = document.getElementById('hud_stall');
    row.classList.remove('warn','ok');
    if (crashed) {
      cell.textContent = crashedReason;
      row.classList.add(crashedReason === "Atterrato" ? 'ok' : 'warn');
    } else if (Math.abs(alpha) > 14) {
      cell.textContent = 'STALLO';
      row.classList.add('warn');
    } else if (running) {
      cell.textContent = 'in volo';
      row.classList.add('ok');
    } else {
      cell.textContent = 'pronto';
    }
  }

  // ---------- UI binding ----------
  const ui = {
    v0: document.getElementById('v0'),
    ang: document.getElementById('ang'),
    h0: document.getElementById('h0'),
    m: document.getElementById('m'),
    s: document.getElementById('s'),
    c: document.getElementById('c'),
    sm: document.getElementById('sm'),
    trim: document.getElementById('trim'),
    wind: document.getElementById('wind'),
    preset: document.getElementById('preset')
  };
  function syncFromUI() {
    P.v0   = parseFloat(ui.v0.value);
    P.ang  = parseFloat(ui.ang.value);
    P.h0   = parseFloat(ui.h0.value);
    P.m    = parseFloat(ui.m.value) / 1000; // g -> kg
    P.S    = parseFloat(ui.s.value);
    P.c    = parseFloat(ui.c.value);
    P.SM   = parseFloat(ui.sm.value);
    P.trim = parseFloat(ui.trim.value);
    P.wind = parseFloat(ui.wind.value);
    document.getElementById('v_v0').textContent = P.v0.toFixed(1);
    document.getElementById('v_ang').textContent = P.ang.toFixed(0);
    document.getElementById('v_h0').textContent = P.h0.toFixed(1);
    document.getElementById('v_m').textContent  = (P.m*1000).toFixed(1);
    document.getElementById('v_s').textContent  = P.S.toFixed(3);
    document.getElementById('v_c').textContent  = P.c.toFixed(2);
    document.getElementById('v_sm').textContent = P.SM.toFixed(2);
    document.getElementById('v_trim').textContent = P.trim.toFixed(1);
    document.getElementById('v_wind').textContent = P.wind.toFixed(1);
  }
  Object.values(ui).forEach(el => {
    if (el.tagName === 'SELECT') return;
    el.addEventListener('input', () => {
      syncFromUI();
      drawLayout();
      if (!running) reset();
    });
  });

  // Preset ottimizzati per tipo di aereo di carta reale.
  // Ogni preset ha parametri tarati per dare un volo "ottimale" per il tipo
  // + una forma usata dal pannello layout (vista dall'alto).
  const PRESETS = {
    dart:      { v0:13, ang: 4, h0:2, m:4,  s:0.018, c:0.22, sm:0.06, trim:-1,
                 shape:'dart',
                 desc:'Freccia tradizionale: alta velocità, piccola superficie, bassa portanza ma grande gittata. Lanciare quasi orizzontale.' },
    stealth:   { v0:11, ang: 5, h0:2, m:5,  s:0.026, c:0.20, sm:0.08, trim: 0,
                 shape:'stealth',
                 desc:'Nakamura Lock: muso largo, ali a freccia. Buon compromesso fra velocità e stabilità.' },
    glider:    { v0: 6, ang:10, h0:2, m:5,  s:0.034, c:0.15, sm:0.10, trim: 0,
                 shape:'glider',
                 desc:'Aliante classico: ali medie e CoG ben avanti. Planata stabile, ottimo per principianti.' },
    longrange: { v0: 7, ang: 7, h0:2, m:4,  s:0.048, c:0.13, sm:0.15, trim: 1,
                 shape:'longrange',
                 desc:'Lunga distanza: ali ampie, leggero, CoG molto avanti. Massimizza la finezza (L/D). Lancio basso.' },
    wide:      { v0: 4, ang:18, h0:2, m:3,  s:0.060, c:0.11, sm:0.12, trim: 2,
                 shape:'wide',
                 desc:'Ali larghe (tipo "Harrier"): volo lentissimo, alta portanza, sensibile al vento.' },
    stunt:     { v0: 8, ang:30, h0:2, m:5,  s:0.045, c:0.14, sm:0.03, trim: 4,
                 shape:'stunt',
                 desc:'Acrobatico: stabilità ridotta + trim positivo elevato → tende a fare looping. Lancio ripido.' },
    hoop:      { v0: 6, ang: 8, h0:2, m:4,  s:0.028, c:0.10, sm:0.18, trim: 0,
                 shape:'hoop',
                 desc:'Hoop wing (ala anulare): cilindro di carta, molto stabile in rollio. Bassa portanza, traiettoria rettilinea.' },
    heavy:     { v0: 9, ang:10, h0:2, m:14, s:0.035, c:0.16, sm:0.08, trim: 0,
                 shape:'glider',
                 desc:'Cartoncino pesante: alta inerzia, poco sensibile al vento, ma cade rapidamente. Serve velocità di lancio elevata.' }
  };
  ui.preset.addEventListener('change', () => {
    const p = PRESETS[ui.preset.value];
    ui.v0.value = p.v0; ui.ang.value = p.ang; ui.h0.value = p.h0;
    ui.m.value = p.m; ui.s.value = p.s; ui.c.value = p.c;
    ui.sm.value = p.sm; ui.trim.value = p.trim;
    syncFromUI();
    drawLayout();
    reset();
  });

  document.getElementById('launch').addEventListener('click', () => {
    if (crashed || !running) {
      simTime = 0;
      reset();
      running = true;
    }
  });
  document.getElementById('reset').addEventListener('click', () => {
    simTime = 0;
    reset();
  });

  // ---------- Layout panel (vista dall'alto) ----------
  const layoutCanvas = document.getElementById('layout');
  const lctx = layoutCanvas.getContext('2d');

  function drawLayout() {
    const preset = PRESETS[ui.preset.value] || PRESETS.glider;
    const shape = preset.shape || 'glider';

    const cw = layoutCanvas.width, ch = layoutCanvas.height;
    lctx.fillStyle = '#0d1420';
    lctx.fillRect(0, 0, cw, ch);

    // griglia
    lctx.strokeStyle = 'rgba(255,255,255,0.05)';
    lctx.lineWidth = 1;
    for (let i = 0; i <= cw; i += 20) {
      lctx.beginPath(); lctx.moveTo(i, 0); lctx.lineTo(i, ch); lctx.stroke();
    }
    for (let i = 0; i <= ch; i += 20) {
      lctx.beginPath(); lctx.moveTo(0, i); lctx.lineTo(cw, i); lctx.stroke();
    }

    // dimensioni reali
    const chord = P.c;             // corda (lunghezza nella direzione di volo)
    const span = P.S / P.c;        // apertura alare approssimata
    // scala adattiva per riempire il pannello mantenendo proporzioni
    const padding = 22;
    const sx = (cw - 2*padding) / chord;
    const sy = (ch - 2*padding) / span;
    const scale = Math.min(sx, sy);
    const cx = cw / 2, cy = ch / 2;

    const Lp = chord * scale;       // lunghezza in px
    const Sp = span * scale;        // span in px

    // disegna sagoma (asse di volo orizzontale, naso a destra)
    lctx.save();
    lctx.translate(cx, cy);
    drawShape(lctx, shape, Lp, Sp);
    lctx.restore();

    // CoG (Centro di gravità) e CP (Centro di pressione)
    // CoG posizionato a frazione (0.25 - SM) dal naso (convenzione: AC a 25% corda)
    const acFrac = 0.25;
    const cgFrac = acFrac - P.SM;   // se SM>0, CoG è davanti all'AC
    const noseX = cx + Lp/2;
    const cgX = noseX - cgFrac * Lp;
    const acX = noseX - acFrac * Lp;

    // AC
    lctx.fillStyle = '#4dc4ff';
    lctx.beginPath(); lctx.arc(acX, cy, 4, 0, Math.PI*2); lctx.fill();
    lctx.fillStyle = '#4dc4ff';
    lctx.font = '9px sans-serif';
    lctx.fillText('CP', acX - 6, cy - 8);

    // CoG
    lctx.fillStyle = '#ffb86b';
    lctx.beginPath();
    lctx.arc(cgX, cy, 5, 0, Math.PI*2);
    lctx.fill();
    lctx.strokeStyle = '#0d1420';
    lctx.lineWidth = 1.5;
    lctx.stroke();
    lctx.fillStyle = '#ffb86b';
    lctx.fillText('CoG', cgX - 9, cy + 14);

    // direzione di volo
    lctx.strokeStyle = 'rgba(255,255,255,0.25)';
    lctx.setLineDash([4,3]);
    lctx.beginPath();
    lctx.moveTo(8, cy);
    lctx.lineTo(cw - 8, cy);
    lctx.stroke();
    lctx.setLineDash([]);
    // freccia direzione
    lctx.fillStyle = 'rgba(255,255,255,0.4)';
    lctx.beginPath();
    lctx.moveTo(cw - 6, cy);
    lctx.lineTo(cw - 12, cy - 4);
    lctx.lineTo(cw - 12, cy + 4);
    lctx.closePath(); lctx.fill();

    // quote
    lctx.fillStyle = 'rgba(255,255,255,0.5)';
    lctx.font = '10px sans-serif';
    lctx.fillText(`corda ${(chord*100).toFixed(0)} cm`, 6, ch - 6);
    lctx.fillText(`span ${(span*100).toFixed(0)} cm`, cw - 80, 14);

    // info testuale
    const info = document.getElementById('layout_info');
    const aspect = (span*span) / P.S;
    info.innerHTML =
      `<b style="color:#e6edf3">${ui.preset.options[ui.preset.selectedIndex].text}</b><br>` +
      `Aspect ratio: ${aspect.toFixed(2)} · Carico alare: ${(P.m * G / P.S).toFixed(1)} N/m²<br>` +
      `<span style="color:#8b98a8">${preset.desc || ''}</span>`;
  }

  function drawShape(c, shape, L, S) {
    // L = lunghezza (corda), S = apertura (span), origine al centro
    c.lineWidth = 1.5;
    c.strokeStyle = '#cfd8dc';
    c.fillStyle = 'rgba(245,245,245,0.92)';
    const nose = L/2, tail = -L/2, half = S/2;

    if (shape === 'dart') {
      // freccia stretta e lunga, ali a delta
      c.beginPath();
      c.moveTo(nose, 0);
      c.lineTo(tail, half);
      c.lineTo(tail + L*0.15, 0);
      c.lineTo(tail, -half);
      c.closePath();
      c.fill(); c.stroke();
      // piega centrale
      c.strokeStyle = '#90a4ae';
      c.beginPath(); c.moveTo(nose, 0); c.lineTo(tail, 0); c.stroke();
    }
    else if (shape === 'stealth') {
      // Nakamura lock: naso a freccia, base più larga, ali poligonali
      c.beginPath();
      c.moveTo(nose, 0);
      c.lineTo(tail + L*0.30,  half*0.45);
      c.lineTo(tail,           half);
      c.lineTo(tail + L*0.18,  0);
      c.lineTo(tail,          -half);
      c.lineTo(tail + L*0.30, -half*0.45);
      c.closePath();
      c.fill(); c.stroke();
      c.strokeStyle = '#90a4ae';
      c.beginPath(); c.moveTo(nose, 0); c.lineTo(tail + L*0.18, 0); c.stroke();
    }
    else if (shape === 'glider') {
      // aliante classico: naso appuntito, ali rettangolari
      c.beginPath();
      c.moveTo(nose, 0);
      c.lineTo(nose - L*0.35,  half);
      c.lineTo(tail,           half);
      c.lineTo(tail + L*0.2,   0);
      c.lineTo(tail,          -half);
      c.lineTo(nose - L*0.35, -half);
      c.closePath();
      c.fill(); c.stroke();
      c.strokeStyle = '#90a4ae';
      c.beginPath(); c.moveTo(nose, 0); c.lineTo(tail + L*0.2, 0); c.stroke();
    }
    else if (shape === 'longrange') {
      // ali lunghe ed allungate
      c.beginPath();
      c.moveTo(nose, 0);
      c.lineTo(nose - L*0.25,  half*0.85);
      c.lineTo(tail + L*0.05,  half);
      c.lineTo(tail,           half*0.9);
      c.lineTo(tail + L*0.15,  0);
      c.lineTo(tail,          -half*0.9);
      c.lineTo(tail + L*0.05, -half);
      c.lineTo(nose - L*0.25, -half*0.85);
      c.closePath();
      c.fill(); c.stroke();
      c.strokeStyle = '#90a4ae';
      c.beginPath(); c.moveTo(nose, 0); c.lineTo(tail + L*0.15, 0); c.stroke();
    }
    else if (shape === 'wide') {
      // ali larghe e corte, tipo Harrier
      c.beginPath();
      c.moveTo(nose, 0);
      c.lineTo(nose - L*0.15,  half);
      c.lineTo(tail,           half*0.95);
      c.lineTo(tail + L*0.25,  0);
      c.lineTo(tail,          -half*0.95);
      c.lineTo(nose - L*0.15, -half);
      c.closePath();
      c.fill(); c.stroke();
      c.strokeStyle = '#90a4ae';
      c.beginPath(); c.moveTo(nose, 0); c.lineTo(tail + L*0.25, 0); c.stroke();
    }
    else if (shape === 'stunt') {
      // pianta simmetrica, ali tipo delta tronco
      c.beginPath();
      c.moveTo(nose, 0);
      c.lineTo(0,  half);
      c.lineTo(tail, half*0.6);
      c.lineTo(tail + L*0.1, 0);
      c.lineTo(tail, -half*0.6);
      c.lineTo(0, -half);
      c.closePath();
      c.fill(); c.stroke();
      c.strokeStyle = '#90a4ae';
      c.beginPath(); c.moveTo(nose, 0); c.lineTo(tail + L*0.1, 0); c.stroke();
    }
    else if (shape === 'hoop') {
      // ala anulare: due cerchi visti dall'alto (cilindro)
      const r = Math.min(L, S) * 0.45;
      c.fillStyle = 'rgba(245,245,245,0.18)';
      c.beginPath();
      c.ellipse(nose - r, 0, r*0.3, r, 0, 0, Math.PI*2);
      c.fill(); c.stroke();
      c.beginPath();
      c.ellipse(tail + r, 0, r*0.3, r, 0, 0, Math.PI*2);
      c.fill(); c.stroke();
      // bastone di collegamento
      c.strokeStyle = '#cfd8dc';
      c.beginPath();
      c.moveTo(nose - r, -r*0.05); c.lineTo(tail + r, -r*0.05);
      c.moveTo(nose - r,  r*0.05); c.lineTo(tail + r,  r*0.05);
      c.stroke();
    }
    else {
      // fallback: triangolo
      c.beginPath();
      c.moveTo(nose, 0);
      c.lineTo(tail, half);
      c.lineTo(tail, -half);
      c.closePath();
      c.fill(); c.stroke();
    }
  }

  // ---------- Modal anatomia ----------
  const modal = document.getElementById('modal');
  const bigCanvas = document.getElementById('bigLayout');
  const bctx = bigCanvas.getContext('2d');

  function openAnatomy() {
    modal.classList.remove('hidden');
    document.getElementById('modal_sub').textContent =
      ui.preset.options[ui.preset.selectedIndex].text + ' — Vista dall\'alto con i punti aerodinamici chiave.';
    drawBigLayout();
  }
  function closeAnatomy() { modal.classList.add('hidden'); }

  document.getElementById('layout_wrap').addEventListener('click', openAnatomy);
  modal.addEventListener('click', (e) => {
    if (e.target.dataset.close !== undefined) closeAnatomy();
  });
  document.addEventListener('keydown', (e) => {
    if (e.key === 'Escape') closeAnatomy();
  });

  function drawBigLayout() {
    const preset = PRESETS[ui.preset.value] || PRESETS.glider;
    const shape = preset.shape || 'glider';
    const cw = bigCanvas.width, ch = bigCanvas.height;

    bctx.fillStyle = '#0d1420';
    bctx.fillRect(0, 0, cw, ch);

    // griglia
    bctx.strokeStyle = 'rgba(255,255,255,0.04)';
    bctx.lineWidth = 1;
    for (let i = 0; i <= cw; i += 30) {
      bctx.beginPath(); bctx.moveTo(i,0); bctx.lineTo(i,ch); bctx.stroke();
    }
    for (let i = 0; i <= ch; i += 30) {
      bctx.beginPath(); bctx.moveTo(0,i); bctx.lineTo(cw,i); bctx.stroke();
    }

    // scala per riempire ~55% larghezza e ~65% altezza per lasciar spazio alle label
    const chord = P.c, span = P.S / P.c;
    const sx = (cw * 0.55) / chord;
    const sy = (ch * 0.55) / span;
    const scale = Math.min(sx, sy);
    const cx = cw / 2, cy = ch / 2;
    const Lp = chord * scale;
    const Sp = span * scale;
    const nose = cx + Lp/2;
    const tail = cx - Lp/2;
    const top  = cy - Sp/2;
    const bot  = cy + Sp/2;

    // sagoma
    bctx.save();
    bctx.translate(cx, cy);
    drawShape(bctx, shape, Lp, Sp);
    bctx.restore();

    // asse di volo
    bctx.strokeStyle = 'rgba(255,255,255,0.2)';
    bctx.setLineDash([6,4]);
    bctx.beginPath();
    bctx.moveTo(20, cy);
    bctx.lineTo(cw - 20, cy);
    bctx.stroke();
    bctx.setLineDash([]);
    bctx.fillStyle = 'rgba(255,255,255,0.5)';
    bctx.beginPath();
    bctx.moveTo(cw - 16, cy);
    bctx.lineTo(cw - 26, cy - 6);
    bctx.lineTo(cw - 26, cy + 6);
    bctx.closePath(); bctx.fill();
    bctx.font = '11px sans-serif';
    bctx.fillStyle = 'rgba(255,255,255,0.55)';
    bctx.fillText('direzione di volo', cw - 130, cy - 8);

    // Posizioni CP e CoG
    const acFrac = 0.25;
    const cgFrac = acFrac - P.SM;
    const cgX = nose - cgFrac * Lp;
    const acX = nose - acFrac * Lp;

    // Quote dimensione corda
    drawDimension(bctx, nose, bot + 36, tail, bot + 36, `corda c = ${(chord*100).toFixed(1)} cm`, '#e6edf3', 'below');
    // Quote apertura alare
    drawDimension(bctx, tail - 32, top, tail - 32, bot, `apertura b = ${(span*100).toFixed(1)} cm`, '#e6edf3', 'left');

    // Margine statico (linea CoG-CP)
    bctx.strokeStyle = '#4ade80';
    bctx.lineWidth = 2;
    bctx.setLineDash([3,3]);
    bctx.beginPath();
    bctx.moveTo(cgX, cy - 14);
    bctx.lineTo(acX, cy - 14);
    bctx.stroke();
    bctx.setLineDash([]);
    bctx.fillStyle = '#4ade80';
    bctx.font = 'bold 11px sans-serif';
    bctx.fillText(`SM = ${P.SM.toFixed(2)} c`, (cgX + acX)/2 - 24, cy - 18);

    // CP
    bctx.fillStyle = '#4dc4ff';
    bctx.beginPath(); bctx.arc(acX, cy, 7, 0, Math.PI*2); bctx.fill();
    bctx.strokeStyle = '#0d1420'; bctx.lineWidth = 2; bctx.stroke();
    // CoG
    bctx.fillStyle = '#ffb86b';
    bctx.beginPath(); bctx.arc(cgX, cy, 8, 0, Math.PI*2); bctx.fill();
    bctx.stroke();

    // annotazioni con leader line
    const annots = [
      { x: nose,           y: cy,             lx: nose + 60,      ly: top - 30,     col:'#f87171',
        title:'Naso', desc:'Bordo d\'attacco' },
      { x: tail,           y: cy + Sp*0.25,   lx: tail - 80,      ly: bot + 70,     col:'#f87171',
        title:'Coda', desc:'Bordo d\'uscita' },
      { x: cgX,            y: cy,             lx: cx - 140,       ly: top - 50,     col:'#ffb86b',
        title:'CoG', desc:'Centro di gravità' },
      { x: acX,            y: cy,             lx: cx + 110,       ly: top - 50,     col:'#4dc4ff',
        title:'CP', desc:'Centro di pressione' },
      { x: nose - 0.5*Lp*0.5, y: top + 4,     lx: cx,             ly: top - 80,     col:'#e6edf3',
        title:'Estremità alare', desc:'Tip' }
    ];
    annots.forEach(a => drawLeader(bctx, a));

    // info ai lati
    bctx.fillStyle = 'rgba(230,237,243,0.85)';
    bctx.font = '11px sans-serif';
    const aspect = (span*span)/P.S;
    const lines = [
      `Superficie alare S = ${P.S.toFixed(3)} m²`,
      `Aspect ratio AR = b²/S = ${aspect.toFixed(2)}`,
      `Massa m = ${(P.m*1000).toFixed(1)} g`,
      `Carico alare W/S = ${(P.m*G/P.S).toFixed(1)} N/m²`,
      `Trim α₀ = ${P.trim.toFixed(1)}°`
    ];
    lines.forEach((t,i) => bctx.fillText(t, 16, ch - 16 - (lines.length-1-i)*16));

    // stabilità
    bctx.font = 'bold 12px sans-serif';
    let stabText, stabCol;
    if (P.SM > 0.05) { stabText = 'STABILE'; stabCol = '#4ade80'; }
    else if (P.SM > -0.01) { stabText = 'NEUTRO'; stabCol = '#ffb86b'; }
    else { stabText = 'INSTABILE'; stabCol = '#f87171'; }
    bctx.fillStyle = stabCol;
    bctx.fillText(stabText, cw - 90, ch - 16);
  }

  function drawLeader(c, a) {
    c.strokeStyle = a.col;
    c.fillStyle = a.col;
    c.lineWidth = 1.2;
    c.beginPath();
    c.moveTo(a.x, a.y);
    c.lineTo(a.lx, a.ly);
    c.stroke();
    c.beginPath();
    c.arc(a.x, a.y, 2.5, 0, Math.PI*2);
    c.fill();
    // label box
    c.font = 'bold 12px sans-serif';
    const w = c.measureText(a.title).width;
    const w2 = c.measureText(a.desc).width;
    const bw = Math.max(w, w2) + 14;
    const bh = 32;
    let bx = a.lx;
    let by = a.ly - bh/2;
    // se label è oltre il bordo destro, sposta a sinistra
    if (bx + bw > c.canvas.width - 4) bx = c.canvas.width - bw - 4;
    if (bx < 4) bx = 4;
    if (by < 4) by = 4;
    c.fillStyle = 'rgba(13,20,32,0.95)';
    c.strokeStyle = a.col;
    c.lineWidth = 1;
    c.beginPath();
    if (c.roundRect) c.roundRect(bx, by, bw, bh, 4);
    else c.rect(bx, by, bw, bh);
    c.fill(); c.stroke();
    c.fillStyle = a.col;
    c.fillText(a.title, bx + 7, by + 13);
    c.font = '10px sans-serif';
    c.fillStyle = '#cfd8dc';
    c.fillText(a.desc, bx + 7, by + 26);
  }

  function drawDimension(c, x1, y1, x2, y2, label, color, side) {
    c.strokeStyle = color;
    c.fillStyle = color;
    c.lineWidth = 1;
    c.beginPath();
    c.moveTo(x1, y1); c.lineTo(x2, y2);
    c.stroke();
    // ticks
    const tick = 5;
    if (Math.abs(y1 - y2) < 1) {
      c.beginPath(); c.moveTo(x1, y1-tick); c.lineTo(x1, y1+tick); c.stroke();
      c.beginPath(); c.moveTo(x2, y2-tick); c.lineTo(x2, y2+tick); c.stroke();
    } else {
      c.beginPath(); c.moveTo(x1-tick, y1); c.lineTo(x1+tick, y1); c.stroke();
      c.beginPath(); c.moveTo(x2-tick, y2); c.lineTo(x2+tick, y2); c.stroke();
    }
    c.font = '11px sans-serif';
    if (side === 'below') {
      c.fillText(label, (x1+x2)/2 - c.measureText(label).width/2, Math.max(y1,y2) + 16);
    } else {
      c.save();
      c.translate(Math.min(x1,x2) - 8, (y1+y2)/2);
      c.rotate(-Math.PI/2);
      c.fillText(label, -c.measureText(label).width/2, 0);
      c.restore();
    }
  }

  // init
  syncFromUI();
  resize();
  reset();
  drawLayout();
  // Sposta il modal a livello document.body così sfugge a eventuali genitori
  // con `transform`/`filter` (es. wrapper Elementor su WordPress) che
  // impedirebbero a `position: fixed` di coprire il viewport.
  if (modal.parentElement !== document.body) document.body.appendChild(modal);
  requestAnimationFrame(loop);
})();
</script>
</body>
</html>
