{"id":2951,"date":"2026-05-21T00:26:46","date_gmt":"2026-05-20T22:26:46","guid":{"rendered":"https:\/\/acriv.org\/WP\/?page_id=2951"},"modified":"2026-05-21T00:26:46","modified_gmt":"2026-05-20T22:26:46","slug":"calculs-navigation","status":"publish","type":"page","link":"https:\/\/acriv.org\/WP\/calculs-navigation\/","title":{"rendered":"CALCULS NAVIGATION"},"content":{"rendered":"\n<p class=\"has-text-align-center has-vivid-red-color has-text-color has-link-color wp-elements-befb809ddd66132d3c9be5514f195c68 wp-block-paragraph\"><strong>Usage p\u00e9dagogique \u2014 Toujours v\u00e9rifier les donn\u00e9es officielles<\/strong><\/p>\n\n\n\n<!DOCTYPE html>\n<html lang=\"fr\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Navigation ACRIV \u2013 Feuille de Route<\/title>\n<style>\n:root {\n  --bleu: #1a3a5c;\n  --bleu2: #2563a8;\n  --bleu3: #3b82c4;\n  --bleu-bg: #eaf2fb;\n  --bleu-light: #dbeafe;\n  --bleu-border: #93c5e8;\n  --gris-bg: #f0f4f8;\n  --gris-border: #ccd6e0;\n  --vert: #166534;\n  --vert-bg: #dcfce7;\n  --vert-border: #86efac;\n  --orange: #92400e;\n  --orange-bg: #fef3c7;\n  --orange-border: #fcd34d;\n  --rouge: #991b1b;\n  --rouge-bg: #fee2e2;\n  --txt: #1a2535;\n  --txt2: #4a5568;\n  --txt3: #8898aa;\n  --r: 8px;\n  --shadow: 0 2px 12px rgba(26,58,92,0.12);\n}\n*{box-sizing:border-box;margin:0;padding:0}\nbody{font-family:'Segoe UI',Arial,sans-serif;background:var(--gris-bg);color:var(--txt);font-size:14px}\n\n\/* \u2500\u2500 HEADER \u2500\u2500 *\/\n.hdr{background:var(--bleu);color:#fff;padding:18px 24px 14px;display:flex;align-items:center;gap:16px}\n.hdr-logo{font-size:26px}\n.hdr-title{flex:1}\n.hdr-title h1{font-size:17px;font-weight:700;letter-spacing:1.2px;text-transform:uppercase}\n.hdr-title p{font-size:11px;opacity:.65;margin-top:2px}\n.hdr-badge{background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.25);border-radius:20px;padding:3px 12px;font-size:11px}\n\n\/* \u2500\u2500 GLOBAL PARAMS \u2500\u2500 *\/\n.global-bar{background:white;border-bottom:2px solid var(--bleu-border);padding:14px 20px;display:flex;flex-wrap:wrap;gap:16px;align-items:flex-end}\n.gp-group{display:flex;flex-direction:column;gap:3px;min-width:130px}\n.gp-group label{font-size:10px;font-weight:700;color:var(--bleu);text-transform:uppercase;letter-spacing:.5px}\n.gp-group input,.gp-group select{border:1.5px solid var(--gris-border);border-radius:5px;padding:6px 9px;font-size:13px;color:var(--txt);background:var(--gris-bg);width:100%}\n.gp-group input:focus,.gp-group select:focus{outline:none;border-color:var(--bleu3);background:#fff}\n\n\/* \u2500\u2500 WRAPPER TABLE \u2500\u2500 *\/\n.wrap{padding:18px 16px 48px;overflow-x:auto}\n\n\/* \u2500\u2500 TABLE NAVIGATION \u2500\u2500 *\/\n.nav-table{width:100%;border-collapse:separate;border-spacing:0;min-width:1100px}\n\n\/* Ent\u00eates *\/\n.nav-table thead tr.head-group th{background:var(--bleu);color:#fff;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.6px;padding:8px 6px;text-align:center;border-right:1px solid rgba(255,255,255,.15)}\n.nav-table thead tr.head-group th:first-child{border-radius:8px 0 0 0}\n.nav-table thead tr.head-group th:last-child{border-radius:0 8px 0 0;border-right:none}\n.nav-table thead tr.head-sub th{background:#e8f0f8;color:var(--bleu);font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.4px;padding:6px 5px;text-align:center;border-bottom:2px solid var(--bleu-border);border-right:1px solid var(--bleu-border)}\n\n\/* Sections couleur *\/\n.th-input{background:#1a3a5c}\n.th-vent{background:#1e5c3a}\n.th-result{background:#7c3a0a}\n.th-caps{background:#3a1a5c}\n\n.th-input-sub{background:#eaf2fb;color:#1a3a5c !important}\n.th-vent-sub{background:#dcfce7;color:#166534 !important}\n.th-result-sub{background:#fef3c7;color:#92400e !important}\n.th-caps-sub{background:#f3e8ff;color:#5b21b6 !important}\n\n\/* Lignes *\/\n.nav-table tbody tr{transition:background .15s}\n.nav-table tbody tr:nth-child(odd){background:#fff}\n.nav-table tbody tr:nth-child(even){background:#f7fafd}\n.nav-table tbody tr:hover{background:#e0eef8}\n\n.nav-table td{padding:5px 5px;border-right:1px solid #dde6ef;border-bottom:1px solid #e8eff6;vertical-align:middle;text-align:center}\n.nav-table td:last-child{border-right:none}\n\n\/* Num\u00e9ro de branche *\/\n.td-num{background:var(--bleu);color:#fff;font-size:12px;font-weight:700;width:32px;min-width:32px}\n\n\/* Inputs dans la table *\/\n.nav-table input[type=text],\n.nav-table input[type=number]{border:1px solid var(--gris-border);border-radius:4px;padding:4px 6px;font-size:12px;background:#f8fafc;color:var(--txt);text-align:center;transition:border .15s}\n.nav-table input[type=text]:focus,\n.nav-table input[type=number]:focus{outline:none;border-color:var(--bleu3);background:#fff}\n.nav-table input[type=text]{width:80px}\n.nav-table input[type=number]{width:62px}\n.nav-table select{border:1px solid var(--gris-border);border-radius:4px;padding:4px 4px;font-size:11px;background:#f8fafc;color:var(--txt);width:110px}\n\n\/* Cellules r\u00e9sultat *\/\n.res-cell{font-size:13px;font-weight:700;min-width:60px}\n.res-blue{color:var(--bleu2)}\n.res-green{color:var(--vert)}\n.res-orange{color:#b45309}\n.res-purple{color:#5b21b6}\n.res-red{color:var(--rouge)}\n.res-dash{color:var(--txt3);font-weight:400;font-size:12px}\n\n\/* \u2500\u2500 BOUTON CALCULER \u2500\u2500 *\/\n.calc-bar{background:white;border-top:2px solid var(--bleu-border);padding:16px 20px;display:flex;align-items:center;gap:16px;flex-wrap:wrap}\n.btn-calc{background:var(--bleu);color:#fff;border:none;border-radius:7px;padding:13px 36px;font-size:14px;font-weight:700;text-transform:uppercase;letter-spacing:1px;cursor:pointer;transition:background .2s,transform .1s;box-shadow:0 3px 10px rgba(26,58,92,.25)}\n.btn-calc:hover{background:var(--bleu2)}\n.btn-calc:active{transform:scale(.98)}\n.btn-reset{background:none;border:1.5px solid var(--gris-border);color:var(--txt2);border-radius:7px;padding:12px 20px;font-size:13px;cursor:pointer;transition:all .2s}\n.btn-reset:hover{border-color:var(--bleu3);color:var(--bleu)}\n.calc-note{font-size:11px;color:var(--txt3);font-style:italic}\n\n\/* \u2500\u2500 R\u00c9SUM\u00c9 \u2500\u2500 *\/\n.summary{background:white;border:1.5px solid var(--bleu-border);border-radius:10px;margin:0 16px 32px;padding:18px 20px;display:none}\n.summary.visible{display:block}\n.summary h3{font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.6px;color:var(--bleu);margin-bottom:12px;border-bottom:1px solid var(--bleu-border);padding-bottom:8px}\n.summ-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:10px}\n.summ-card{background:var(--bleu-bg);border:1px solid var(--bleu-border);border-radius:7px;padding:10px 12px;text-align:center}\n.summ-card .sl{font-size:10px;font-weight:700;color:var(--txt3);text-transform:uppercase;letter-spacing:.4px;margin-bottom:3px}\n.summ-card .sv{font-size:20px;font-weight:700;color:var(--bleu)}\n.summ-card .su{font-size:10px;color:var(--txt3)}\n\n\/* \u2500\u2500 LEGENDE \u2500\u2500 *\/\n.legend{margin:0 16px 20px;padding:12px 16px;background:#fff;border:1px solid var(--gris-border);border-radius:8px;display:flex;flex-wrap:wrap;gap:12px;font-size:11px;color:var(--txt2)}\n.leg-item{display:flex;align-items:center;gap:5px}\n.leg-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}\n\n@media(max-width:700px){\n  .global-bar{flex-direction:column}\n  .gp-group{min-width:100%}\n  .hdr{padding:12px 14px}\n}\n<\/style>\n<\/head>\n<body>\n\n<!-- \u2500\u2500 HEADER \u2500\u2500 -->\n<div class=\"hdr\">\n  <div class=\"hdr-logo\">\u2708<\/div>\n  <div class=\"hdr-title\">\n    <h1>Feuille de Route \u2013 Navigation VFR<\/h1>\n    <p>Calcul des caps, d\u00e9rives et temps de vol par branche \u00b7 PPL \/ LAPL<\/p>\n  <\/div>\n  <span class=\"hdr-badge\">ACRIV \u00b7 Bretagne<\/span>\n<\/div>\n\n<!-- \u2500\u2500 PARAM\u00c8TRES GLOBAUX \u2500\u2500 -->\n<div class=\"global-bar\">\n  <div class=\"gp-group\">\n    <label>Vitesse propre (VP \/ TAS) <span style=\"font-weight:400;text-transform:none\">kt<\/span><\/label>\n    <input type=\"number\" id=\"g_vp\" placeholder=\"ex: 100\" min=\"30\" max=\"400\" step=\"1\">\n  <\/div>\n  <div class=\"gp-group\">\n    <label>Zone de vol \u2013 D\u00e9clinaison magn\u00e9tique<\/label>\n    <select id=\"g_decl\">\n      <option value=\"-1.0\">Rennes \/ Ille-et-Vilaine  (\u22121.0\u00b0)<\/option>\n      <option value=\"-0.8\">Laval \/ Mayenne  (\u22120.8\u00b0)<\/option>\n      <option value=\"-1.5\">Pontivy \/ Morbihan  (\u22121.5\u00b0)<\/option>\n      <option value=\"-1.2\">Dinard \/ C\u00f4te d&rsquo;\u00c9meraude  (\u22121.2\u00b0)<\/option>\n      <option value=\"-1.7\">Saint-Brieuc \/ C\u00f4tes d&rsquo;Armor  (\u22121.7\u00b0)<\/option>\n      <option value=\"-1.3\">La Baule \/ Loire-Atlantique  (\u22121.3\u00b0)<\/option>\n      <option value=\"-0.6\">Angers \/ Maine-et-Loire  (\u22120.6\u00b0)<\/option>\n    <\/select>\n  <\/div>\n  <div class=\"gp-group\">\n    <label>Correction compas (d\u00e9viation) <span style=\"font-weight:400;text-transform:none\">\u00b0<\/span><\/label>\n    <input type=\"number\" id=\"g_dev\" value=\"0\" min=\"-20\" max=\"20\" step=\"0.5\">\n    <span style=\"font-size:10px;color:var(--txt3);font-style:italic\">+ = Est \u00b7 \u2212 = Ouest \u00b7 0 = CM=CC<\/span>\n  <\/div>\n  <div class=\"gp-group\">\n    <label>Altitude de vol <span style=\"font-weight:400;text-transform:none\">ft<\/span><\/label>\n    <input type=\"number\" id=\"g_alt\" placeholder=\"ex: 3500\" min=\"0\" max=\"20000\" step=\"100\">\n  <\/div>\n<\/div>\n\n<!-- \u2500\u2500 TABLE NAVIGATION \u2500\u2500 -->\n<div class=\"wrap\">\n<table class=\"nav-table\" id=\"navtable\">\n<thead>\n  <tr class=\"head-group\">\n    <th rowspan=\"2\" style=\"width:32px;background:var(--bleu)\">#<\/th>\n    <!-- ENTR\u00c9ES ROUTE -->\n    <th colspan=\"4\" class=\"th-input\">\u2708 Donn\u00e9es de la branche<\/th>\n    <!-- VENT -->\n    <th colspan=\"2\" class=\"th-vent\">\ud83d\udca8 Vent sur la branche<\/th>\n    <!-- R\u00c9SULTATS VENT -->\n    <th colspan=\"4\" class=\"th-result\">\ud83d\udcca R\u00e9sultats vent<\/th>\n    <!-- CAPS -->\n    <th colspan=\"4\" class=\"th-caps\">\ud83e\udded Caps &amp; Temps<\/th>\n  <\/tr>\n  <tr class=\"head-sub\">\n    <th class=\"th-input-sub\">Waypoint<\/th>\n    <th class=\"th-input-sub\">Distance<br><small>NM<\/small><\/th>\n    <th class=\"th-input-sub\">Route vraie<br><small>\u00b0V<\/small><\/th>\n    <th class=\"th-input-sub\">Remarques<\/th>\n\n    <th class=\"th-vent-sub\">Dir. vent<br><small>\u00b0V (d&rsquo;o\u00f9)<\/small><\/th>\n    <th class=\"th-vent-sub\">Force<br><small>kt<\/small><\/th>\n\n    <th class=\"th-result-sub\">Vent eff.<br><small>Ve (kt)<\/small><\/th>\n    <th class=\"th-result-sub\">Vent trav.<br><small>Vt (kt)<\/small><\/th>\n    <th class=\"th-result-sub\">D\u00e9rive<br><small>\u00b0<\/small><\/th>\n    <th class=\"th-result-sub\">Temps<br><small>corrig\u00e9<\/small><\/th>\n\n    <th class=\"th-caps-sub\">Cap vrai<br><small>\u00b0V<\/small><\/th>\n    <th class=\"th-caps-sub\">Cap mag.<br><small>\u00b0M<\/small><\/th>\n    <th class=\"th-caps-sub\">Cap compas<br><small>\u00b0CC<\/small><\/th>\n    <th class=\"th-caps-sub\">Vit. sol<br><small>GS (kt)<\/small><\/th>\n  <\/tr>\n<\/thead>\n<tbody id=\"nav-body\">\n<!-- 8 lignes g\u00e9n\u00e9r\u00e9es par JS -->\n<\/tbody>\n<\/table>\n<\/div>\n\n<!-- \u2500\u2500 BOUTON CALCULER \u2500\u2500 -->\n<div class=\"calc-bar\">\n  <button class=\"btn-calc\" onclick=\"calculerNav()\">\u25b6\u25b6 CALCULER LA NAVIGATION<\/button>\n  <button class=\"btn-reset\" onclick=\"resetNav()\">\u21ba R\u00e9initialiser<\/button>\n  <span class=\"calc-note\">Remplissez VP, zone et au moins une branche avant de calculer<\/span>\n<\/div>\n\n<!-- \u2500\u2500 R\u00c9SUM\u00c9 \u2500\u2500 -->\n<div class=\"summary\" id=\"summary\">\n  <h3>\ud83d\udccb R\u00e9sum\u00e9 du vol<\/h3>\n  <div class=\"summ-grid\" id=\"summ-grid\"><\/div>\n<\/div>\n\n<!-- \u2500\u2500 L\u00c9GENDE \u2500\u2500 -->\n<div class=\"legend\">\n  <strong style=\"color:var(--txt)\">L\u00e9gende :<\/strong>\n  <div class=\"leg-item\"><div class=\"leg-dot\" style=\"background:#2563a8\"><\/div> Donn\u00e9es calcul\u00e9es<\/div>\n  <div class=\"leg-item\"><div class=\"leg-dot\" style=\"background:#166534\"><\/div> R\u00e9sultats vent<\/div>\n  <div class=\"leg-item\"><div class=\"leg-dot\" style=\"background:#5b21b6\"><\/div> Caps finaux<\/div>\n  <div class=\"leg-item\" style=\"color:var(--txt3)\">Ve+ = vent de face \u00b7 Ve\u2212 = vent de dos \u00b7 Vt = cross-wind<\/div>\n  <div class=\"leg-item\" style=\"color:var(--txt3)\">D\u00e9rive+ = \u00e0 droite \u00b7 D\u00e9rive\u2212 = \u00e0 gauche (cap vrai = route vraie \u2212 d\u00e9rive)<\/div>\n<\/div>\n\n<div style=\"background:var(--bleu);color:white;text-align:center;padding:12px;font-size:11px;opacity:.85\">\n  ACRIV \u00b7 A\u00e9roclub Rennes Ille-et-Vilaine \u00b7 <a href=\"https:\/\/acriv.org\/WP\/\" style=\"color:#93c5e8\">acriv.org<\/a> \u00b7 Calculs indicatifs \u2013 publications officielles font foi\n<\/div>\n\n<script>\n\/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\/\/ UTILITAIRES\n\/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst toRad = d => d * Math.PI \/ 180;\nconst toDeg = r => r * 180 \/ Math.PI;\nconst norm  = a => ((a % 360) + 360) % 360;\nconst fmt1  = v => isNaN(v) ? '\u2013' : v.toFixed(1);\nconst fmt0  = v => isNaN(v) ? '\u2013' : Math.round(v).toString();\nconst fmtT  = s => {\n  if (isNaN(s) || s <= 0) return '\u2013';\n  const m = Math.floor(s \/ 60), sec = Math.round(s % 60);\n  return m + 'min' + (sec > 0 ? sec.toString().padStart(2,'0') + 's' : '');\n};\n\n\/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\/\/ G\u00c9N\u00c9RATION DES 8 LIGNES\n\/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction buildRows() {\n  const tbody = document.getElementById('nav-body');\n  tbody.innerHTML = '';\n  for (let i = 1; i <= 8; i++) {\n    const even = i % 2 === 0;\n    tbody.innerHTML += `\n    <tr>\n      <td class=\"td-num\">${i}<\/td>\n\n      <!-- Donn\u00e9es branche -->\n      <td><input type=\"text\"   id=\"wp_${i}\"  placeholder=\"WPT\u2026\"  style=\"width:90px\"><\/td>\n      <td><input type=\"number\" id=\"dist_${i}\" placeholder=\"NM\"   min=\"0\" max=\"9999\" step=\"0.1\" style=\"width:64px\"><\/td>\n      <td><input type=\"number\" id=\"rv_${i}\"   placeholder=\"000\"  min=\"0\" max=\"360\"  step=\"1\"   style=\"width:62px\"><\/td>\n      <td><input type=\"text\"   id=\"rem_${i}\"  placeholder=\"\u2014\"    style=\"width:80px\"><\/td>\n\n      <!-- Vent -->\n      <td><input type=\"number\" id=\"wd_${i}\"   placeholder=\"\u00b0V\"   min=\"0\" max=\"360\"  step=\"1\"   style=\"width:58px\"><\/td>\n      <td><input type=\"number\" id=\"wf_${i}\"   placeholder=\"kt\"   min=\"0\" max=\"200\"  step=\"1\"   style=\"width:52px\"><\/td>\n\n      <!-- R\u00e9sultats vent -->\n      <td class=\"res-cell res-dash\" id=\"ve_${i}\">\u2013<\/td>\n      <td class=\"res-cell res-dash\" id=\"vt_${i}\">\u2013<\/td>\n      <td class=\"res-cell res-dash\" id=\"dr_${i}\">\u2013<\/td>\n      <td class=\"res-cell res-dash\" id=\"tm_${i}\">\u2013<\/td>\n\n      <!-- Caps -->\n      <td class=\"res-cell res-dash\" id=\"cv_${i}\">\u2013<\/td>\n      <td class=\"res-cell res-dash\" id=\"cm_${i}\">\u2013<\/td>\n      <td class=\"res-cell res-dash\" id=\"cc_${i}\">\u2013<\/td>\n      <td class=\"res-cell res-dash\" id=\"gs_${i}\">\u2013<\/td>\n    <\/tr>`;\n  }\n}\nbuildRows();\n\n\/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\/\/ CALCUL PRINCIPAL\n\/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction calculerNav() {\n  const VP   = parseFloat(document.getElementById('g_vp').value);\n  const Dmag = parseFloat(document.getElementById('g_decl').value);\n  const Dev  = parseFloat(document.getElementById('g_dev').value) || 0;\n\n  if (isNaN(VP) || VP <= 0) {\n    alert('Veuillez renseigner la Vitesse Propre (VP \/ TAS) en kt.');\n    return;\n  }\n\n  let totalDist = 0, totalTemps = 0, nbBranches = 0;\n\n  for (let i = 1; i <= 8; i++) {\n    const dist = parseFloat(document.getElementById(`dist_${i}`).value);\n    const rv   = parseFloat(document.getElementById(`rv_${i}`).value);\n    const wd   = parseFloat(document.getElementById(`wd_${i}`).value);\n    const wf   = parseFloat(document.getElementById(`wf_${i}`).value);\n\n    \/\/ Si pas de donn\u00e9es minimales \u2192 vider la ligne\n    if (isNaN(dist) || isNaN(rv)) {\n      ['ve','vt','dr','tm','cv','cm','cc','gs'].forEach(id => {\n        const el = document.getElementById(`${id}_${i}`);\n        el.textContent = '\u2013';\n        el.className = 'res-cell res-dash';\n      });\n      continue;\n    }\n    nbBranches++;\n    totalDist += dist;\n\n    \/\/ \u2500\u2500 CALCUL VENT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    let Ve = 0, Vt = 0, derive = 0, GS = VP;\n\n    if (!isNaN(wd) && !isNaN(wf) && wf > 0) {\n      \/\/ alpha = angle entre vent (vecteur vers) et route vraie\n      const alpha = toRad(norm((wd + 180) - rv));\n      Ve = wf * Math.cos(alpha);          \/\/ vent effectif axial (+ = face, \u2212 = dos)\n      Vt = wf * Math.sin(alpha);          \/\/ vent traversier (+ = vient de droite)\n\n      \/\/ D\u00e9rive = arcsin(Vt \/ VP), corrig\u00e9e\n      const sinDerive = Math.min(1, Math.max(-1, Vt \/ VP));\n      derive = toDeg(Math.asin(sinDerive)); \/\/ + = d\u00e9rive \u00e0 droite\n\n      \/\/ GS = composante axiale de VP sur l'axe de route + Ve\n      GS = VP * Math.cos(toRad(derive)) + Ve;\n    }\n\n    \/\/ \u2500\u2500 CAP VRAI = Route vraie \u2212 d\u00e9rive \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    \/\/ Pour corriger la d\u00e9rive, on vise \u00e0 gauche si vent de droite\n    const capVrai = norm(rv - derive);\n\n    \/\/ \u2500\u2500 CAP MAGN\u00c9TIQUE = Cap vrai \u2212 Dmag \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    \/\/ Bretagne : Dmag \u2248 \u22121\u00b0 \u00e0 \u22121.7\u00b0 (Ouest) \u2192 CM = CV \u2212 Dmag = CV + |Dmag|\n    const capMag = norm(capVrai - Dmag);\n\n    \/\/ \u2500\u2500 CAP COMPAS = Cap mag \u2212 D\u00e9viation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    const capCC = norm(capMag - Dev);\n\n    \/\/ \u2500\u2500 TEMPS = Distance \/ GS (heures \u2192 secondes) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    const temps = GS > 0 ? (dist \/ GS) * 3600 : NaN;\n    if (!isNaN(temps)) totalTemps += temps;\n\n    \/\/ \u2500\u2500 AFFICHAGE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    \/\/ Vent effectif\n    const elVe = document.getElementById(`ve_${i}`);\n    elVe.textContent = fmt1(Ve) + ' kt';\n    elVe.className = 'res-cell ' + (Ve > 0 ? 'res-red' : Ve < -2 ? 'res-green' : 'res-blue');\n\n    \/\/ Vent traversier\n    const elVt = document.getElementById(`vt_${i}`);\n    const absVt = Math.abs(Vt);\n    elVt.textContent = fmt1(absVt) + ' kt';\n    elVt.className = 'res-cell ' + (absVt > 15 ? 'res-red' : absVt > 8 ? 'res-orange' : 'res-green');\n\n    \/\/ D\u00e9rive\n    const elDr = document.getElementById(`dr_${i}`);\n    elDr.textContent = (derive >= 0 ? '+' : '') + fmt1(derive) + '\u00b0';\n    elDr.className = 'res-cell ' + (Math.abs(derive) > 10 ? 'res-red' : Math.abs(derive) > 5 ? 'res-orange' : 'res-green');\n\n    \/\/ Temps corrig\u00e9\n    const elTm = document.getElementById(`tm_${i}`);\n    elTm.textContent = fmtT(temps);\n    elTm.className = 'res-cell res-blue';\n\n    \/\/ Cap vrai\n    const elCv = document.getElementById(`cv_${i}`);\n    elCv.textContent = fmt0(capVrai) + '\u00b0';\n    elCv.className = 'res-cell res-purple';\n\n    \/\/ Cap magn\u00e9tique\n    const elCm = document.getElementById(`cm_${i}`);\n    elCm.textContent = fmt0(capMag) + '\u00b0';\n    elCm.className = 'res-cell res-purple';\n\n    \/\/ Cap compas\n    const elCc = document.getElementById(`cc_${i}`);\n    elCc.textContent = fmt0(capCC) + '\u00b0';\n    elCc.className = 'res-cell res-purple';\n    if (Dev !== 0) elCc.style.fontWeight = '900';\n\n    \/\/ Vitesse sol\n    const elGs = document.getElementById(`gs_${i}`);\n    elGs.textContent = fmt0(GS) + ' kt';\n    elGs.className = 'res-cell res-blue';\n  }\n\n  \/\/ \u2500\u2500 R\u00c9SUM\u00c9 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  if (nbBranches > 0) {\n    const hh = Math.floor(totalTemps \/ 3600);\n    const mm = Math.floor((totalTemps % 3600) \/ 60);\n    const ss = Math.round(totalTemps % 60);\n    const tStr = hh > 0 ? `${hh}h${mm.toString().padStart(2,'0')}` : `${mm}min${ss.toString().padStart(2,'0')}s`;\n\n    document.getElementById('summ-grid').innerHTML = `\n      <div class=\"summ-card\">\n        <div class=\"sl\">Branches calcul\u00e9es<\/div>\n        <div class=\"sv\">${nbBranches}<\/div>\n        <div class=\"su\">\/ 8<\/div>\n      <\/div>\n      <div class=\"summ-card\">\n        <div class=\"sl\">Distance totale<\/div>\n        <div class=\"sv\">${totalDist.toFixed(1)}<\/div>\n        <div class=\"su\">NM<\/div>\n      <\/div>\n      <div class=\"summ-card\">\n        <div class=\"sl\">Temps total estim\u00e9<\/div>\n        <div class=\"sv\" style=\"font-size:18px\">${tStr}<\/div>\n        <div class=\"su\">hh:mm ou min:ss<\/div>\n      <\/div>\n      <div class=\"summ-card\">\n        <div class=\"sl\">Vitesse propre (TAS)<\/div>\n        <div class=\"sv\">${VP}<\/div>\n        <div class=\"su\">kt<\/div>\n      <\/div>\n      <div class=\"summ-card\">\n        <div class=\"sl\">D\u00e9clinaison appliqu\u00e9e<\/div>\n        <div class=\"sv\" style=\"font-size:18px\">${Dmag}\u00b0<\/div>\n        <div class=\"su\">magn\u00e9tique Ouest<\/div>\n      <\/div>\n      <div class=\"summ-card\">\n        <div class=\"sl\">D\u00e9viation compas<\/div>\n        <div class=\"sv\" style=\"font-size:18px\">${Dev >= 0 ? '+' : ''}${Dev}\u00b0<\/div>\n        <div class=\"su\">${Dev === 0 ? 'CM = CC' : 'correction active'}<\/div>\n      <\/div>`;\n    document.getElementById('summary').classList.add('visible');\n  }\n}\n\n\/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\/\/ RESET\n\/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction resetNav() {\n  ['g_vp','g_dev','g_alt'].forEach(id => {\n    const el = document.getElementById(id);\n    if (el) { el.value = id === 'g_dev' ? '0' : ''; }\n  });\n  document.getElementById('g_decl').selectedIndex = 0;\n  buildRows();\n  document.getElementById('summary').classList.remove('visible');\n}\n<\/script>\n<\/body>\n<\/html>\n\n","protected":false},"excerpt":{"rendered":"<p>Usage p\u00e9dagogique \u2014 Toujours v\u00e9rifier les donn\u00e9es officielles Navigation ACRIV \u2013 Feuille de Route \u2708 Feuille de Route \u2013 Navigation VFR Calcul des caps, d\u00e9rives et temps de vol par branche \u00b7 PPL \/ LAPL ACRIV \u00b7 Bretagne Vitesse propre (VP \/ TAS) kt Zone de vol \u2013 D\u00e9clinaison magn\u00e9tique Rennes \/ Ille-et-Vilaine (\u22121.0\u00b0)Laval \/ Mayenne (\u22120.8\u00b0)Pontivy \/ Morbihan (\u22121.5\u00b0)Dinard<\/p>\n<p><a class=\"more-link\" href=\"https:\/\/acriv.org\/WP\/calculs-navigation\/\">Read More<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2951","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/acriv.org\/WP\/wp-json\/wp\/v2\/pages\/2951","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/acriv.org\/WP\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/acriv.org\/WP\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/acriv.org\/WP\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/acriv.org\/WP\/wp-json\/wp\/v2\/comments?post=2951"}],"version-history":[{"count":1,"href":"https:\/\/acriv.org\/WP\/wp-json\/wp\/v2\/pages\/2951\/revisions"}],"predecessor-version":[{"id":2952,"href":"https:\/\/acriv.org\/WP\/wp-json\/wp\/v2\/pages\/2951\/revisions\/2952"}],"wp:attachment":[{"href":"https:\/\/acriv.org\/WP\/wp-json\/wp\/v2\/media?parent=2951"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}