{"id":2908,"date":"2026-05-12T01:32:00","date_gmt":"2026-05-11T23:32:00","guid":{"rendered":"https:\/\/acriv.org\/WP\/?page_id=2908"},"modified":"2026-05-12T01:40:13","modified_gmt":"2026-05-11T23:40:13","slug":"ifr-holding-pattern","status":"publish","type":"page","link":"https:\/\/acriv.org\/WP\/ifr-holding-pattern\/","title":{"rendered":"IFR HOLDING PATTERN"},"content":{"rendered":"\n\n<style>\n  @import url('https:\/\/fonts.googleapis.com\/css2?family=Share+Tech+Mono&family=Barlow:wght@400;500;600&display=swap');\n  * { box-sizing: border-box; margin: 0; padding: 0; }\n  .wp-container { max-width: 860px; margin: 0 auto; padding: 1.5rem 1rem; }\n  .wp-header { border-left: 4px solid #f0a500; padding-left: 1rem; margin-bottom: 1.5rem; }\n  .wp-title { font-size: 22px; font-weight: 600; color: var(--color-text-primary); letter-spacing: -0.3px; font-family: 'Barlow', sans-serif; }\n  .wp-subtitle { font-size: 13px; color: var(--color-text-secondary); margin-top: 4px; font-family: 'Barlow', sans-serif; }\n  .form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-bottom: 1.5rem; }\n  .form-card { background: var(--color-background-primary); border: 0.5px solid var(--color-border-tertiary); border-radius: 12px; padding: 1rem 1.25rem; }\n  .form-label { font-size: 11px; font-weight: 600; letter-spacing: 0.8px; text-transform: uppercase; color: var(--color-text-secondary); margin-bottom: 8px; display: block; font-family: 'Barlow', sans-serif; }\n  .form-label span { font-style: normal; color: #f0a500; text-transform: none; letter-spacing: 0; font-size: 10px; }\n  .form-row { display: flex; align-items: center; gap: 8px; }\n  .mono-input { font-family: 'Share Tech Mono', monospace; font-size: 22px; width: 100%; background: var(--color-background-secondary); border: 1px solid var(--color-border-tertiary); border-radius: 8px; padding: 8px 12px; color: var(--color-text-primary); outline: none; transition: border-color 0.2s; -moz-appearance: textfield; }\n  .mono-input::-webkit-outer-spin-button, .mono-input::-webkit-inner-spin-button { -webkit-appearance: none; }\n  .mono-input:focus { border-color: #f0a500; }\n  .unit-badge { font-size: 12px; color: var(--color-text-secondary); min-width: 28px; text-align: right; font-family: 'Barlow', sans-serif; }\n  .select-wrapper { position: relative; }\n  .select-input { width: 100%; font-family: 'Barlow', sans-serif; font-size: 14px; background: var(--color-background-secondary); border: 1px solid var(--color-border-tertiary); border-radius: 8px; padding: 10px 12px; color: var(--color-text-primary); outline: none; cursor: pointer; appearance: none; transition: border-color 0.2s; }\n  .select-input:focus { border-color: #f0a500; }\n  .select-wrapper::after { content: '\u25be'; position: absolute; right: 12px; top: 50%; transform: translateY(-50%); font-size: 12px; color: var(--color-text-secondary); pointer-events: none; }\n  .slider-section { margin-top: 8px; }\n  .slider-value { font-family: 'Share Tech Mono', monospace; font-size: 28px; color: #f0a500; display: block; margin-bottom: 6px; line-height: 1; }\n  .slider-value span { font-size: 14px; color: var(--color-text-secondary); }\n  input[type=range].cap-slider { width: 100%; accent-color: #f0a500; }\n  .compass-row { display: flex; align-items: center; gap: 10px; margin-top: 4px; font-size: 12px; color: var(--color-text-secondary); font-family: 'Barlow', sans-serif; }\n  .compass-label { min-width: 28px; text-align: center; font-weight: 500; color: var(--color-text-secondary); }\n  .btn-wrapper { display: flex; justify-content: center; margin-bottom: 1.5rem; }\n  .compute-btn { width: 320px; padding: 14px 24px; font-family: 'Barlow', sans-serif; font-size: 15px; font-weight: 600; letter-spacing: 0.5px; background: #f0a500; color: #1a1a1a; border: none; border-radius: 10px; cursor: pointer; transition: opacity 0.15s, transform 0.1s; }\n  .compute-btn:hover { opacity: 0.92; }\n  .compute-btn:active { transform: scale(0.99); }\n  .result-section { display: none; }\n  .result-section.visible { display: block; }\n  .entry-badge { display: inline-flex; align-items: center; gap: 8px; padding: 10px 18px; border-radius: 999px; font-size: 16px; font-weight: 600; margin-bottom: 1rem; letter-spacing: 0.2px; font-family: 'Barlow', sans-serif; }\n  .entry-badge.directe { background: rgba(46,204,113,0.15); color: #27ae60; border: 1.5px solid rgba(46,204,113,0.4); }\n  .entry-badge.parallele { background: rgba(52,152,219,0.15); color: #2980b9; border: 1.5px solid rgba(52,152,219,0.4); }\n  .entry-badge.teardrop { background: rgba(155,89,182,0.15); color: #8e44ad; border: 1.5px solid rgba(155,89,182,0.4); }\n  .result-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-bottom: 1.5rem; }\n  .result-card { background: var(--color-background-secondary); border-radius: 10px; padding: 12px 14px; }\n  .result-card-label { font-size: 11px; color: var(--color-text-secondary); text-transform: uppercase; letter-spacing: 0.6px; margin-bottom: 4px; font-family: 'Barlow', sans-serif; }\n  .result-card-value { font-family: 'Share Tech Mono', monospace; font-size: 20px; color: var(--color-text-primary); }\n  .schema-container { background: var(--color-background-primary); border: 0.5px solid var(--color-border-tertiary); border-radius: 12px; padding: 1.25rem; overflow: hidden; }\n  .schema-title { font-size: 13px; font-weight: 600; color: var(--color-text-secondary); text-transform: uppercase; letter-spacing: 0.7px; margin-bottom: 1rem; font-family: 'Barlow', sans-serif; }\n  .desc-box { background: var(--color-background-secondary); border-left: 3px solid #f0a500; border-radius: 0 8px 8px 0; padding: 10px 14px; font-size: 13px; color: var(--color-text-primary); line-height: 1.6; margin-bottom: 1rem; font-family: 'Barlow', sans-serif; }\n  .procedure-steps { list-style: none; margin-top: 1rem; }\n  .procedure-steps li { font-size: 13px; color: var(--color-text-secondary); padding: 6px 0; padding-left: 1.4rem; position: relative; border-bottom: 0.5px solid var(--color-border-tertiary); font-family: 'Barlow', sans-serif; }\n  .procedure-steps li:last-child { border-bottom: none; }\n  .procedure-steps li::before { content: attr(data-n); position: absolute; left: 0; font-family: 'Share Tech Mono', monospace; font-size: 11px; color: #f0a500; font-weight: 600; top: 7px; }\n  .legend-row { display: flex; gap: 16px; flex-wrap: wrap; margin-top: 12px; padding-top: 12px; border-top: 0.5px solid var(--color-border-tertiary); font-size: 12px; color: var(--color-text-secondary); font-family: 'Barlow', sans-serif; }\n  .legend-item { display: flex; align-items: center; gap: 5px; }\n  .legend-dot { width: 10px; height: 10px; border-radius: 50%; flex-shrink: 0; }\n  @media (max-width: 600px) { .form-grid { grid-template-columns: 1fr; } .result-grid { grid-template-columns: 1fr; } .compute-btn { width: 100%; } }\n<\/style>\n\n<div class=\"wp-container\">\n  <div class=\"wp-header\">\n    <div class=\"wp-title\">Calculateur d&rsquo;entr\u00e9e en holding IFR<\/div>\n    <div class=\"wp-subtitle\">D\u00e9termination automatique du type d&rsquo;entr\u00e9e selon OACI \/ FAA<\/div>\n  <\/div>\n\n  <div class=\"form-grid\">\n    <div class=\"form-card\">\n      <label class=\"form-label\">Radial d&rsquo;entr\u00e9e (QDR) <span>\u2014 axe d&rsquo;entr\u00e9e vers le rep\u00e8re<\/span><\/label>\n      <div class=\"slider-section\">\n        <span class=\"slider-value\" id=\"radial-display\">270 <span>\u00b0<\/span><\/span>\n        <input type=\"range\" class=\"cap-slider\" id=\"radial-slider\" min=\"1\" max=\"360\" value=\"270\" oninput=\"updateRadial(this.value)\">\n        <div class=\"compass-row\">\n          <span class=\"compass-label\">N 360<\/span>\n          <div style=\"flex:1;height:1px;background:var(--color-border-tertiary)\"><\/div>\n          <span class=\"compass-label\">E 090<\/span>\n          <div style=\"flex:1;height:1px;background:var(--color-border-tertiary)\"><\/div>\n          <span class=\"compass-label\">S 180<\/span>\n          <div style=\"flex:1;height:1px;background:var(--color-border-tertiary)\"><\/div>\n          <span class=\"compass-label\">W 270<\/span>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"form-card\">\n      <label class=\"form-label\">Cap magn\u00e9tique avion <span>\u2014 au moment du passage<\/span><\/label>\n      <div class=\"slider-section\">\n        <span class=\"slider-value\" id=\"cap-display\">090 <span>\u00b0<\/span><\/span>\n        <input type=\"range\" class=\"cap-slider\" id=\"cap-slider\" min=\"1\" max=\"360\" value=\"90\" oninput=\"updateCap(this.value)\">\n        <div class=\"compass-row\">\n          <span class=\"compass-label\">N 360<\/span>\n          <div style=\"flex:1;height:1px;background:var(--color-border-tertiary)\"><\/div>\n          <span class=\"compass-label\">E 090<\/span>\n          <div style=\"flex:1;height:1px;background:var(--color-border-tertiary)\"><\/div>\n          <span class=\"compass-label\">S 180<\/span>\n          <div style=\"flex:1;height:1px;background:var(--color-border-tertiary)\"><\/div>\n          <span class=\"compass-label\">W 270<\/span>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"form-card\">\n      <label class=\"form-label\">C\u00f4t\u00e9 des virages<\/label>\n      <div class=\"select-wrapper\">\n        <select class=\"select-input\" id=\"turn-side\">\n          <option value=\"droite\">Droite (standard)<\/option>\n          <option value=\"gauche\">Gauche (non standard)<\/option>\n        <\/select>\n      <\/div>\n    <\/div>\n\n    <div class=\"form-card\">\n      <label class=\"form-label\">Cap entr\u00e9e attente (inbound) <span>\u2014 vers le rep\u00e8re<\/span><\/label>\n      <div class=\"slider-section\">\n        <span class=\"slider-value\" id=\"inbound-display\">090 <span>\u00b0<\/span><\/span>\n        <input type=\"range\" class=\"cap-slider\" id=\"inbound-slider\" min=\"1\" max=\"360\" value=\"90\" oninput=\"updateInbound(this.value)\">\n        <div class=\"compass-row\">\n          <span class=\"compass-label\">N 360<\/span>\n          <div style=\"flex:1;height:1px;background:var(--color-border-tertiary)\"><\/div>\n          <span class=\"compass-label\">E 090<\/span>\n          <div style=\"flex:1;height:1px;background:var(--color-border-tertiary)\"><\/div>\n          <span class=\"compass-label\">S 180<\/span>\n          <div style=\"flex:1;height:1px;background:var(--color-border-tertiary)\"><\/div>\n          <span class=\"compass-label\">W 270<\/span>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"form-card\">\n      <label class=\"form-label\">Dur\u00e9e branche d&rsquo;\u00e9loignement<\/label>\n      <div class=\"select-wrapper\">\n        <select class=\"select-input\" id=\"leg-time\">\n          <option value=\"1\">1 minute (\u2264 FL140)<\/option>\n          <option value=\"1.5\" selected>1 min 30 s (> FL140)<\/option>\n          <option value=\"2\">2 minutes (proc\u00e9dure publi\u00e9e)<\/option>\n        <\/select>\n      <\/div>\n    <\/div>\n\n    <div class=\"form-card\">\n      <label class=\"form-label\">Niveau de vol (FL)<\/label>\n      <div class=\"form-row\">\n        <input type=\"number\" class=\"mono-input\" id=\"fl-input\" placeholder=\"140\" min=\"0\" max=\"600\" value=\"140\">\n        <span class=\"unit-badge\">FL<\/span>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"btn-wrapper\">\n    <button class=\"compute-btn\" onclick=\"computeHolding()\">\u25b6 CALCULER L&rsquo;ENTR\u00c9E<\/button>\n  <\/div>\n\n  <div class=\"result-section\" id=\"result-section\">\n    <div id=\"entry-badge-container\"><\/div>\n    <div class=\"desc-box\" id=\"desc-text\"><\/div>\n    <div class=\"result-grid\">\n      <div class=\"result-card\"><div class=\"result-card-label\">Cap inbound<\/div><div class=\"result-card-value\" id=\"r-inbound\">\u2014<\/div><\/div>\n      <div class=\"result-card\"><div class=\"result-card-label\">Cap outbound<\/div><div class=\"result-card-value\" id=\"r-outbound\">\u2014<\/div><\/div>\n      <div class=\"result-card\"><div class=\"result-card-label\">Dur\u00e9e branche<\/div><div class=\"result-card-value\" id=\"r-time\">\u2014<\/div><\/div>\n      <div class=\"result-card\"><div class=\"result-card-label\">Virages<\/div><div class=\"result-card-value\" id=\"r-turns\">\u2014<\/div><\/div>\n    <\/div>\n    <div class=\"schema-container\">\n      <div class=\"schema-title\">Sch\u00e9ma du holding<\/div>\n      <canvas id=\"holdingCanvas\" width=\"800\" height=\"520\" style=\"width:100%;height:auto;display:block;\"><\/canvas>\n      <ul class=\"procedure-steps\" id=\"proc-steps\"><\/ul>\n      <div class=\"legend-row\">\n        <span class=\"legend-item\"><span class=\"legend-dot\" style=\"background:#f0a500\"><\/span>Trajectoire avion<\/span>\n        <span class=\"legend-item\"><span class=\"legend-dot\" style=\"background:#2ecc71\"><\/span>Holding (virage droit)<\/span>\n        <span class=\"legend-item\"><span class=\"legend-dot\" style=\"background:#8e44ad\"><\/span>Holding (virage gauche)<\/span>\n        <span class=\"legend-item\"><span class=\"legend-dot\" style=\"background:#e74c3c\"><\/span>Rep\u00e8re \/ fix<\/span>\n        <span class=\"legend-item\"><span class=\"legend-dot\" style=\"background:#3498db\"><\/span>Secteur d&rsquo;entr\u00e9e<\/span>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<script>\nlet radialVal=270,capVal=90,inboundVal=90;\nfunction pad3(n){return String(Math.round(n)).padStart(3,'0');}\nfunction updateRadial(v){radialVal=parseInt(v);document.getElementById('radial-display').innerHTML=pad3(radialVal)+' <span>\u00b0<\/span>';}\nfunction updateCap(v){capVal=parseInt(v);document.getElementById('cap-display').innerHTML=pad3(capVal)+' <span>\u00b0<\/span>';}\nfunction updateInbound(v){inboundVal=parseInt(v);document.getElementById('inbound-display').innerHTML=pad3(inboundVal)+' <span>\u00b0<\/span>';}\n\nfunction computeHolding(){\n  const turnSide=document.getElementById('turn-side').value;\n  const legTime=parseFloat(document.getElementById('leg-time').value);\n  const isRight=turnSide==='droite';\n  const outbound=((inboundVal+180)%360)||360;\n  const relAngle=((capVal-outbound)%360+360)%360;\n  let entryType;\n  if(isRight){\n    if(relAngle<=70||relAngle>=290) entryType='directe';\n    else if(relAngle>70&&relAngle<=180) entryType='parallele';\n    else entryType='teardrop';\n  } else {\n    if(relAngle>=290||relAngle<=70) entryType='directe';\n    else if(relAngle>180&&relAngle<290) entryType='parallele';\n    else entryType='teardrop';\n  }\n  const typeLabels={directe:'Entr\u00e9e directe',parallele:'Entr\u00e9e parall\u00e8le',teardrop:'Entr\u00e9e d\u00e9cal\u00e9e (teardrop)'};\n  const typeIcons={directe:'\u25cf',parallele:'\u25c6',teardrop:'\u25b2'};\n  document.getElementById('entry-badge-container').innerHTML=`<div class=\"entry-badge ${entryType}\">${typeIcons[entryType]} ${typeLabels[entryType]}<\/div>`;\n  const descs={\n    directe:`L'avion arrive dans le secteur d'entr\u00e9e directe. Il s'aligne directement sur le cap d'attente (inbound), effectue un virage standard de 180\u00b0 c\u00f4t\u00e9 ${turnSide}, puis suit la branche d'\u00e9loignement (outbound) pendant ${legTime<1.5?'1 minute':legTime+' min'}, avant de revenir sur le rep\u00e8re.`,\n    parallele:`L'avion arrive dans le secteur d'entr\u00e9e parall\u00e8le. Il vole parall\u00e8lement \u00e0 la branche d'\u00e9loignement (outbound) en s'\u00e9loignant du rep\u00e8re, effectue un virage de 180\u00b0 c\u00f4t\u00e9 ${isRight?'gauche':'droite'} pour couper vers le circuit, puis rejoint la branche inbound.`,\n    teardrop:`L'avion arrive dans le secteur d'entr\u00e9e d\u00e9cal\u00e9e (teardrop). Il vole en s'\u00e9loignant du rep\u00e8re avec un cap d\u00e9cal\u00e9 de 30\u00b0 vers l'int\u00e9rieur du holding, pendant ${legTime} minute(s), effectue un virage c\u00f4t\u00e9 ${turnSide} pour intercepter la branche inbound.`\n  };\n  document.getElementById('desc-text').textContent=descs[entryType];\n  document.getElementById('r-inbound').textContent=pad3(inboundVal)+'\u00b0';\n  document.getElementById('r-outbound').textContent=pad3(outbound)+'\u00b0';\n  document.getElementById('r-time').textContent=legTime===1?'1 min':legTime+' min';\n  document.getElementById('r-turns').textContent=isRight?'\u00c0 droite (standard)':'\u00c0 gauche';\n  const steps={\n    directe:['Passer sur le rep\u00e8re au cap d\\'attente (inbound)','Virer '+turnSide+' (180\u00b0) pour rejoindre l\\'outbound','Maintenir outbound ('+pad3(outbound)+'\u00b0) pendant '+(legTime===1?'1 min':legTime+' min'),'Virer '+turnSide+' (180\u00b0) pour revenir sur le rep\u00e8re','R\u00e9p\u00e9ter le circuit'],\n    parallele:['Passer sur le rep\u00e8re et maintenir cap outbound ('+pad3(outbound)+'\u00b0) parall\u00e8lement au circuit','Apr\u00e8s '+(legTime===1?'1 min':legTime+' min')+', virer '+(isRight?'gauche':'droite')+' (180\u00b0)','Intercepter la branche inbound ('+pad3(inboundVal)+'\u00b0)','Passer le rep\u00e8re et d\u00e9marrer le circuit normal'],\n    teardrop:['Passer le rep\u00e8re et prendre un cap '+pad3(((outbound+(isRight?-30:30))+360)%360)+'\u00b0 (outbound d\u00e9cal\u00e9 30\u00b0 vers l\\'int\u00e9rieur)','Maintenir ce cap pendant '+(legTime===1?'1 min':legTime+' min'),'Virer '+turnSide+' (180\u00b0+) pour intercepter inbound ('+pad3(inboundVal)+'\u00b0)','Passer le rep\u00e8re et d\u00e9marrer le circuit normal']\n  };\n  document.getElementById('proc-steps').innerHTML=steps[entryType].map((s,i)=>`<li data-n=\"${i+1}\">${s}<\/li>`).join('');\n  document.getElementById('result-section').classList.add('visible');\n  drawHolding(inboundVal,outbound,capVal,turnSide,entryType,legTime);\n}\n\nfunction drawHolding(inbound,outbound,cap,turnSide,entryType,legTime){\n  const canvas=document.getElementById('holdingCanvas');\n  const ctx=canvas.getContext('2d');\n  const W=800,H=520;\n  canvas.width=W;canvas.height=H;\n  ctx.clearRect(0,0,W,H);\n  const dark=window.matchMedia('(prefers-color-scheme: dark)').matches;\n  const textColor=dark?'#c2c0b6':'#3d3d3a';\n  const holdColor=turnSide==='droite'?'#2ecc71':'#8e44ad';\n  const cx=370,cy=270,R=90,armLen=170;\n  const toRad=deg=>(deg-90)*Math.PI\/180;\n  const inRad=toRad(inbound),outRad=toRad(outbound);\n  const sign=turnSide==='droite'?1:-1;\n  const perpX=Math.sin(outRad+Math.PI\/2*sign),perpY=-Math.cos(outRad+Math.PI\/2*sign);\n  const c1x=cx+perpX*R,c1y=cy+perpY*R;\n  const ox=cx+Math.cos(outRad)*armLen,oy=cy+Math.sin(outRad)*armLen;\n  const c2x=ox+perpX*R,c2y=oy+perpY*R;\n  const toAngle=(dx,dy)=>Math.atan2(dy,dx);\n  const a1start=toAngle(cx-c1x,cy-c1y),a1end=toAngle(ox-c1x,oy-c1y);\n  const a2start=toAngle(ox-c2x,oy-c2y),a2end=toAngle(cx-c2x,cy-c2y);\n  const sR=200;\n  function drawSector(startDeg,endDeg,color){\n    ctx.beginPath();ctx.moveTo(cx,cy);\n    ctx.arc(cx,cy,sR,toRad(startDeg),toRad(endDeg),false);\n    ctx.closePath();ctx.fillStyle=color;ctx.fill();\n  }\n  if(turnSide==='droite'){\n    drawSector(outbound-70,outbound+70,'rgba(46,204,113,0.12)');\n    drawSector(outbound+70,outbound+180,'rgba(52,152,219,0.12)');\n    drawSector(outbound+180,outbound+290,'rgba(142,68,173,0.12)');\n  } else {\n    drawSector(outbound-70,outbound+70,'rgba(46,204,113,0.12)');\n    drawSector(outbound-180,outbound-70,'rgba(52,152,219,0.12)');\n    drawSector(outbound-290,outbound-180,'rgba(142,68,173,0.12)');\n  }\n  ctx.setLineDash([5,4]);ctx.lineWidth=0.8;\n  ctx.strokeStyle=dark?'rgba(255,255,255,0.15)':'rgba(0,0,0,0.15)';\n  function sectorLine(deg){ctx.beginPath();ctx.moveTo(cx,cy);ctx.lineTo(cx+Math.cos(toRad(deg))*sR,cy+Math.sin(toRad(deg))*sR);ctx.stroke();}\n  if(turnSide==='droite'){sectorLine(outbound-70);sectorLine(outbound+70);sectorLine(outbound+180);sectorLine(outbound+290);}\n  else{sectorLine(outbound-70);sectorLine(outbound+70);sectorLine(outbound-180);sectorLine(outbound-290);}\n  ctx.setLineDash([]);\n  ctx.lineWidth=2.5;ctx.strokeStyle=holdColor;\n  ctx.beginPath();ctx.moveTo(ox,oy);ctx.lineTo(cx,cy);ctx.stroke();\n  const antiCW=turnSide!=='droite';\n  ctx.beginPath();ctx.arc(c1x,c1y,R,a1start,a1end,antiCW);ctx.stroke();\n  const tang1x=c1x+Math.cos(a1end)*R,tang1y=c1y+Math.sin(a1end)*R;\n  ctx.beginPath();ctx.moveTo(tang1x,tang1y);ctx.lineTo(ox,oy);ctx.stroke();\n  ctx.beginPath();ctx.arc(c2x,c2y,R,a2start,a2end,antiCW);ctx.stroke();\n  ctx.setLineDash([6,4]);ctx.strokeStyle=dark?'rgba(255,255,255,0.2)':'rgba(0,0,0,0.15)';ctx.lineWidth=1;\n  ctx.beginPath();ctx.moveTo(cx,cy);ctx.lineTo(cx+Math.cos(inRad)*120,cy+Math.sin(inRad)*120);ctx.stroke();\n  ctx.setLineDash([]);\n  function arrowAt(px,py,angleDeg){\n    const ar=toRad(angleDeg),as=10;\n    ctx.save();ctx.translate(px,py);ctx.rotate(ar+Math.PI\/2);\n    ctx.beginPath();ctx.moveTo(0,-as);ctx.lineTo(-as*0.4,as*0.2);ctx.lineTo(as*0.4,as*0.2);ctx.closePath();\n    ctx.fillStyle=holdColor;ctx.fill();ctx.restore();\n  }\n  arrowAt((ox+cx)\/2,(oy+cy)\/2,inbound);\n  arrowAt((tang1x+ox)\/2,(tang1y+oy)\/2,outbound);\n  const highlightColors={directe:'rgba(46,204,113,0.22)',parallele:'rgba(52,152,219,0.22)',teardrop:'rgba(142,68,173,0.22)'};\n  if(turnSide==='droite'){\n    if(entryType==='directe') drawSector(outbound-70,outbound+70,highlightColors.directe);\n    else if(entryType==='parallele') drawSector(outbound+70,outbound+180,highlightColors.parallele);\n    else drawSector(outbound+180,outbound+290,highlightColors.teardrop);\n  } else {\n    if(entryType==='directe') drawSector(outbound-70,outbound+70,highlightColors.directe);\n    else if(entryType==='parallele') drawSector(outbound-180,outbound-70,highlightColors.parallele);\n    else drawSector(outbound-290,outbound-180,highlightColors.teardrop);\n  }\n  ctx.beginPath();ctx.arc(cx,cy,10,0,Math.PI*2);ctx.fillStyle='#e74c3c';ctx.fill();\n  ctx.strokeStyle=dark?'#ff8080':'#c0392b';ctx.lineWidth=2;ctx.stroke();\n  ctx.beginPath();ctx.moveTo(cx-6,cy);ctx.lineTo(cx+6,cy);ctx.moveTo(cx,cy-6);ctx.lineTo(cx,cy+6);\n  ctx.strokeStyle='white';ctx.lineWidth=1.5;ctx.stroke();\n  const capRad=toRad(cap),arrL=200;\n  const arrStartX=cx-Math.cos(capRad)*arrL,arrStartY=cy-Math.sin(capRad)*arrL;\n  ctx.lineWidth=2.5;ctx.strokeStyle='#f0a500';ctx.setLineDash([8,4]);\n  ctx.beginPath();ctx.moveTo(arrStartX,arrStartY);ctx.lineTo(cx,cy);ctx.stroke();\n  ctx.setLineDash([]);\n  ctx.save();ctx.translate(cx,cy);ctx.rotate(capRad+Math.PI\/2);\n  ctx.beginPath();ctx.moveTo(0,-14);ctx.lineTo(-7,4);ctx.lineTo(0,0);ctx.lineTo(7,4);ctx.closePath();\n  ctx.fillStyle='#f0a500';ctx.fill();ctx.restore();\n  ctx.font='500 12px Barlow, sans-serif';ctx.textAlign='center';ctx.textBaseline='middle';\n  function sectorLabel(deg,dist,text,color){\n    const lx=cx+Math.cos(toRad(deg))*dist,ly=cy+Math.sin(toRad(deg))*dist;\n    ctx.fillStyle=color;ctx.fillText(text,lx,ly);\n  }\n  if(turnSide==='droite'){\n    sectorLabel(outbound,130,'\u2460 Directe','rgba(46,180,100,0.85)');\n    sectorLabel(outbound+125,140,'\u2461 Parall\u00e8le','rgba(52,130,200,0.85)');\n    sectorLabel(outbound+235,140,'\u2462 D\u00e9cal\u00e9e','rgba(120,60,170,0.85)');\n  } else {\n    sectorLabel(outbound,130,'\u2460 Directe','rgba(46,180,100,0.85)');\n    sectorLabel(outbound-125,140,'\u2461 Parall\u00e8le','rgba(52,130,200,0.85)');\n    sectorLabel(outbound-235,140,'\u2462 D\u00e9cal\u00e9e','rgba(120,60,170,0.85)');\n  }\n  ctx.beginPath();ctx.arc(cx,cy,10,0,Math.PI*2);ctx.fillStyle='#e74c3c';ctx.fill();\n  ctx.strokeStyle=dark?'#ff8080':'#c0392b';ctx.lineWidth=2;ctx.stroke();\n  ctx.beginPath();ctx.moveTo(cx-6,cy);ctx.lineTo(cx+6,cy);ctx.moveTo(cx,cy-6);ctx.lineTo(cx,cy+6);\n  ctx.strokeStyle='white';ctx.lineWidth=1.5;ctx.stroke();\n  ctx.font='600 12px Barlow, sans-serif';ctx.fillStyle='#e74c3c';ctx.textAlign='left';ctx.fillText('FIX',cx+14,cy-8);\n  ctx.font='500 11px Share Tech Mono, monospace';ctx.fillStyle='#f0a500';ctx.textAlign='center';\n  const midArrX=(arrStartX+cx)\/2,midArrY=(arrStartY+cy)\/2;\n  const perpCapX=-Math.sin(capRad),perpCapY=Math.cos(capRad);\n  ctx.fillText(pad3(cap)+'\u00b0',midArrX+perpCapX*18,midArrY+perpCapY*18);\n  const midInbX=(ox+cx)\/2,midInbY=(oy+cy)\/2,midOutX=(tang1x+ox)\/2,midOutY=(tang1y+oy)\/2;\n  const pi=toRad(inbound),po=toRad(outbound);\n  ctx.fillStyle=holdColor;ctx.font='500 11px Share Tech Mono, monospace';\n  ctx.fillText(pad3(inbound)+'\u00b0',midInbX+Math.cos(pi+Math.PI\/2*sign)*(-18),midInbY+Math.sin(pi+Math.PI\/2*sign)*(-18));\n  ctx.fillText(pad3(outbound)+'\u00b0',midOutX+Math.cos(po-Math.PI\/2*sign)*18,midOutY+Math.sin(po-Math.PI\/2*sign)*18);\n  drawCompass(ctx,55,55,35,dark,textColor);\n}\n\nfunction drawCompass(ctx,x,y,r,dark,textColor){\n  ctx.save();\n  ctx.beginPath();ctx.arc(x,y,r,0,Math.PI*2);\n  ctx.fillStyle=dark?'rgba(30,30,30,0.7)':'rgba(255,255,255,0.7)';ctx.fill();\n  ctx.strokeStyle=dark?'rgba(255,255,255,0.15)':'rgba(0,0,0,0.15)';ctx.lineWidth=0.5;ctx.stroke();\n  for(let i=0;i<36;i++){\n    const a=i*10*Math.PI\/180,isMajor=i%9===0,len=isMajor?8:4;\n    ctx.beginPath();ctx.moveTo(x+Math.sin(a)*(r-len),y-Math.cos(a)*(r-len));ctx.lineTo(x+Math.sin(a)*r,y-Math.cos(a)*r);\n    ctx.strokeStyle=dark?(isMajor?'rgba(255,255,255,0.6)':'rgba(255,255,255,0.2)'):(isMajor?'rgba(0,0,0,0.5)':'rgba(0,0,0,0.2)');\n    ctx.lineWidth=isMajor?1.2:0.5;ctx.stroke();\n  }\n  ctx.font='600 9px Barlow, sans-serif';ctx.textAlign='center';ctx.textBaseline='middle';ctx.fillStyle=textColor;\n  ctx.fillText('N',x,y-r+13);ctx.fillText('S',x,y+r-13);ctx.fillText('E',x+r-11,y);ctx.fillText('W',x-r+11,y);\n  ctx.beginPath();ctx.moveTo(x,y-r+8);ctx.lineTo(x-4,y);ctx.lineTo(x,y+4);ctx.lineTo(x+4,y);ctx.closePath();\n  ctx.fillStyle='#e74c3c';ctx.fill();\n  ctx.beginPath();ctx.moveTo(x,y+4);ctx.lineTo(x-4,y);ctx.lineTo(x,y+r-8);ctx.lineTo(x+4,y);ctx.closePath();\n  ctx.fillStyle=dark?'#888':'#ccc';ctx.fill();\n  ctx.restore();\n}\n<\/script>\n\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Calculateur d&rsquo;entr\u00e9e en holding IFR D\u00e9termination automatique du type d&rsquo;entr\u00e9e selon OACI \/ FAA Radial d&rsquo;entr\u00e9e (QDR) \u2014 axe d&rsquo;entr\u00e9e vers le rep\u00e8re 270 \u00b0 N 360 E 090 S 180 W 270 Cap magn\u00e9tique avion \u2014 au moment du passage 090 \u00b0 N 360 E 090 S 180 W 270 C\u00f4t\u00e9 des virages Droite (standard)Gauche (non standard) Cap entr\u00e9e<\/p>\n<p><a class=\"more-link\" href=\"https:\/\/acriv.org\/WP\/ifr-holding-pattern\/\">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-2908","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/acriv.org\/WP\/wp-json\/wp\/v2\/pages\/2908","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=2908"}],"version-history":[{"count":4,"href":"https:\/\/acriv.org\/WP\/wp-json\/wp\/v2\/pages\/2908\/revisions"}],"predecessor-version":[{"id":2912,"href":"https:\/\/acriv.org\/WP\/wp-json\/wp\/v2\/pages\/2908\/revisions\/2912"}],"wp:attachment":[{"href":"https:\/\/acriv.org\/WP\/wp-json\/wp\/v2\/media?parent=2908"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}