// Orrery Lab · H4 · cálculo do índice cíclico de Barbault // Efeméride: astronomy-engine 2.1.19 (https://cdn.jsdelivr.net/npm/astronomy-engine@2.1.19) // Corre em Node (npm i astronomy-engine@2.1.19) ou no browser (window.Astronomy). // // Definição (Barbault): soma das 10 distâncias angulares, pelo caminho mais curto (0–180°), // entre as longitudes eclípticas geocêntricas aparentes (com aberração) de Júpiter, Saturno, // Úrano, Neptuno e Plutão. Máximo teórico com 5 corpos: 1080. // Valor anual = média dos valores diários às 12:00 UTC de 1 jan a 31 dez. // Coluna extra (exploratória): valor a 1 de janeiro às 12:00 UTC, como Barbault usava. const A = (typeof window !== 'undefined' && window.Astronomy) || require('astronomy-engine'); const CORPOS = ['Jupiter', 'Saturn', 'Uranus', 'Neptune', 'Pluto']; function indice(ms) { const t = A.MakeTime(new Date(ms)); const L = CORPOS.map(b => A.Ecliptic(A.GeoVector(b, t, true)).elon); let s = 0; for (let i = 0; i < 5; i++) for (let j = i + 1; j < 5; j++) { let x = Math.abs(L[i] - L[j]) % 360; if (x > 180) x = 360 - x; s += x; } return s; } function anual(y) { const a = Date.UTC(y, 0, 1, 12), b = Date.UTC(y + 1, 0, 1, 12); let s = 0, n = 0; for (let m = a; m < b; m += 86400000) { s += indice(m); n++; } return [s / n, indice(a)]; } // Anos 1216–2625: cobrem 1816–2025 com desfasamentos até ±600 anos. function csvIndice(y0 = 1216, y1 = 2625) { const linhas = ['ano,indice_media_anual,indice_1jan']; for (let y = y0; y <= y1; y++) { const [m, j] = anual(y); linhas.push(`${y},${m.toFixed(4)},${j.toFixed(4)}`); } return linhas.join('\n') + '\n'; } if (typeof module !== 'undefined' && require.main === module) process.stdout.write(csvIndice()); if (typeof module !== 'undefined') module.exports = { indice, anual, csvIndice };