'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var base = require('./base.cjs'); var coord = require('./coord.cjs'); var nutation = require('./nutation.cjs'); var planetposition = require('./planetposition.cjs'); /** * @copyright 2013 Sonia Keys * @copyright 2016 commenthol * @license MIT * @module saturnring */ /** * Ring computes quantities of the ring of Saturn. * * B Saturnicentric latitude of the Earth referred to the plane of the ring. * Bʹ Saturnicentric latitude of the Sun referred to the plane of the ring. * ΔU Difference between Saturnicentric longitudes of the Sun and the Earth. * P Geometric position angle of the northern semiminor axis of the ring. * aEdge Major axis of the out edge of the outer ring. * bEdge Minor axis of the out edge of the outer ring. * * All results in radians. */ function ring (jde, earth, saturn) { // (jde float64, earth, saturn *pp.V87Planet) (B, Bʹ, ΔU, P, aEdge, bEdge float64) const [f1, f2] = cl(jde, earth, saturn); const [ΔU, B] = f1(); const [Bʹ, P, aEdge, bEdge] = f2(); return [B, Bʹ, ΔU, P, aEdge, bEdge] } /** * UB computes quantities required by illum.Saturn(). * * Same as ΔU and B returned by Ring(). Results in radians. */ function ub (jde, earth, saturn) { // (jde float64, earth, saturn *pp.V87Planet) (ΔU, B float64) const [f1, f2] = cl(jde, earth, saturn); // eslint-disable-line no-unused-vars return f1() } /** * cl splits the work into two closures. */ function cl (jde, earth, saturn) { // (jde float64, earth, saturn *pp.V87Planet) (f1 func() (ΔU, B float64), // f2 func() (Bʹ, P, aEdge, bEdge float64)) const p = Math.PI / 180; let i, Ω; let l0, b0, R; let Δ = 9.0; let λ, β; let si, ci, sβ, cβ, sB; let sbʹ, cbʹ, slʹΩ, clʹΩ; const f1 = function () { // (ΔU, B float64) // (45.1), p. 318 const T = base["default"].J2000Century(jde); i = base["default"].horner(T, 28.075216 * p, -0.012998 * p, 0.000004 * p); Ω = base["default"].horner(T, 169.50847 * p, 1.394681 * p, 0.000412 * p); // Step 2.0 const earthPos = earth.position(jde); R = earthPos.range; const fk5 = planetposition["default"].toFK5(earthPos.lon, earthPos.lat, jde); l0 = fk5.lon; b0 = fk5.lat; const [sl0, cl0] = base["default"].sincos(l0); const sb0 = Math.sin(b0); // Steps 3, 4.0 let l = 0; let b = 0; let r = 0; let x = 0; let y = 0; let z = 0; const f = function () { const τ = base["default"].lightTime(Δ); const saturnPos = saturn.position(jde - τ); r = saturnPos.range; const fk5 = planetposition["default"].toFK5(saturnPos.lon, saturnPos.lat, jde); l = fk5.lon; b = fk5.lat; const [sl, cl] = base["default"].sincos(l); const [sb, cb] = base["default"].sincos(b); x = r * cb * cl - R * cl0; y = r * cb * sl - R * sl0; z = r * sb - R * sb0; Δ = Math.sqrt(x * x + y * y + z * z); }; f(); f(); // Step 5.0 λ = Math.atan2(y, x); β = Math.atan(z / Math.hypot(x, y)); // First part of step 6.0 si = Math.sin(i); ci = Math.cos(i); sβ = Math.sin(β); cβ = Math.cos(β); sB = si * cβ * Math.sin(λ - Ω) - ci * sβ; const B = Math.asin(sB); // return value // Step 7.0 const N = 113.6655 * p + 0.8771 * p * T; const lʹ = l - 0.01759 * p / r; const bʹ = b - 0.000764 * p * Math.cos(l - N) / r; // Setup for steps 8, 9.0 sbʹ = Math.sin(bʹ); cbʹ = Math.cos(bʹ); slʹΩ = Math.sin(lʹ - Ω); clʹΩ = Math.cos(lʹ - Ω); // Step 9.0 const [sλΩ, cλΩ] = base["default"].sincos(λ - Ω); const U1 = Math.atan2(si * sbʹ + ci * cbʹ * slʹΩ, cbʹ * clʹΩ); const U2 = Math.atan2(si * sβ + ci * cβ * sλΩ, cβ * cλΩ); const ΔU = Math.abs(U1 - U2); // return value return [ΔU, B] }; const f2 = function () { // (Bʹ, P, aEdge, bEdge) { // Remainder of step 6.0 const aEdge = 375.35 / 3600 * p / Δ; // return value const bEdge = aEdge * Math.abs(sB); // return value // Step 8.0 const sBʹ = si * cbʹ * slʹΩ - ci * sbʹ; const Bʹ = Math.asin(sBʹ); // return value // Step 10.0 const [Δψ, Δε] = nutation["default"].nutation(jde); const ε = nutation["default"].meanObliquity(jde) + Δε; // Step 11.0 let λ0 = Ω - Math.PI / 2; const β0 = Math.PI / 2 - i; // Step 12.0 const [sl0λ, cl0λ] = base["default"].sincos(l0 - λ); λ += 0.005693 * p * cl0λ / cβ; β += 0.005693 * p * sl0λ * sβ; // Step 13.0 λ0 += Δψ; λ += Δψ; // Step 14.0 let eq = new coord["default"].Ecliptic(λ0, β0).toEquatorial(ε); const [α0, δ0] = [eq.ra, eq.dec]; eq = new coord["default"].Ecliptic(λ, β).toEquatorial(ε); const [α, δ] = [eq.ra, eq.dec]; // Step 15.0 const [sδ0, cδ0] = base["default"].sincos(δ0); const [sδ, cδ] = base["default"].sincos(δ); const [sα0α, cα0α] = base["default"].sincos(α0 - α); const P = Math.atan2(cδ0 * sα0α, sδ0 * cδ - cδ0 * sδ * cα0α); // return value return [Bʹ, P, aEdge, bEdge] }; return [f1, f2] } var saturnring = { ring, ub }; exports["default"] = saturnring; exports.ring = ring; exports.ub = ub;