django-vue3-admin-web/node_modules/astronomia/lib/line.cjs
2025-10-20 21:21:14 +08:00

147 lines
4.7 KiB
JavaScript

'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var base = require('./base.cjs');
var interpolation = require('./interpolation.cjs');
/**
* @copyright 2013 Sonia Keys
* @copyright 2016 commenthol
* @license MIT
* @module line
*/
/**
* Time computes the time at which a moving body is on a straight line (great
* circle) between two fixed points, such as stars.
*
* Coordinates may be right ascensions and declinations or longitudes and
* latitudes. Fixed points are r1, d1, r2, d2. Moving body is an ephemeris
* of 5 rows, r3, d3, starting at time t1 and ending at time t5. Time scale
* is arbitrary.
*
* @throws Error
* @param {Number} r1 - right ascension Coordinate 1
* @param {Number} d1 - declination Coordinate 1
* @param {Number} r2 - right ascension Coordinate 2
* @param {Number} d2 - declination Coordinate 2
* @param {Number[]} r3 - right ascension Coordinate 3
* @param {Number[]} d3 - declination Coordinate 3
* @param {Number} t1 - time in Julian Days
* @param {Number} t5 - time in Julian Days
* @returns {Number} time of alignment in Julian Days
*/
function time (r1, d1, r2, d2, r3, d3, t1, t5) { // (r1, d1, r2, d2 float64, r3, d3 []float64, t1, t5 float64) (float64, error)
if (r3.length !== 5 || d3.length !== 5) {
throw new Error('r3, d3 must be length 5')
}
const gc = new Array(5);
r3.forEach((r3i, i) => {
// (19.1) p. 121
gc[i] = Math.tan(d1) * Math.sin(r2 - r3i) +
Math.tan(d2) * Math.sin(r3i - r1) +
Math.tan(d3[i]) * Math.sin(r1 - r2);
});
const l5 = new interpolation["default"].Len5(t1, t5, gc);
return l5.zero(false)
}
/**
* Angle returns the angle between great circles defined by three points.
*
* Coordinates may be right ascensions and declinations or longitudes and
* latitudes. If r1, d1, r2, d2 defines one line and r2, d2, r3, d3 defines
* another, the result is the angle between the two lines.
*
* Algorithm by Meeus.
*/
function angle (r1, d1, r2, d2, r3, d3) { // (r1, d1, r2, d2, r3, d3 float64) float64
const [sd2, cd2] = base["default"].sincos(d2);
const [sr21, cr21] = base["default"].sincos(r2 - r1);
const [sr32, cr32] = base["default"].sincos(r3 - r2);
const C1 = Math.atan2(sr21, cd2 * Math.tan(d1) - sd2 * cr21);
const C2 = Math.atan2(sr32, cd2 * Math.tan(d3) - sd2 * cr32);
return C1 + C2
}
/**
* Error returns an error angle of three nearly co-linear points.
*
* For the line defined by r1, d1, r2, d2, the result is the anglular distance
* between that line and r0, d0.
*
* Algorithm by Meeus.
*/
function error (r1, d1, r2, d2, r0, d0) { // (r1, d1, r2, d2, r0, d0 float64) float64
const [sr1, cr1] = base["default"].sincos(r1);
const [sd1, cd1] = base["default"].sincos(d1);
const [sr2, cr2] = base["default"].sincos(r2);
const [sd2, cd2] = base["default"].sincos(d2);
const X1 = cd1 * cr1;
const X2 = cd2 * cr2;
const Y1 = cd1 * sr1;
const Y2 = cd2 * sr2;
const Z1 = sd1;
const Z2 = sd2;
const A = Y1 * Z2 - Z1 * Y2;
const B = Z1 * X2 - X1 * Z2;
const C = X1 * Y2 - Y1 * X2;
const m = Math.tan(r0);
const n = Math.tan(d0) / Math.cos(r0);
return Math.asin((A + B * m + C * n) /
(Math.sqrt(A * A + B * B + C * C) * Math.sqrt(1 + m * m + n * n)))
}
/**
* AngleError returns both an angle as in the function Angle, and an error
* as in the function Error.
*
* The algorithm is by B. Pessens.
*
* @returns {Number[]} [ψ, ω]
* {Number} ψ - angle between great circles defined by three points.
* {Number} ω - error angle of three nearly co-linear points
*/
function angleError (r1, d1, r2, d2, r3, d3) {
const [sr1, cr1] = base["default"].sincos(r1);
const [c1, cd1] = base["default"].sincos(d1);
const [sr2, cr2] = base["default"].sincos(r2);
const [c2, cd2] = base["default"].sincos(d2);
const [sr3, cr3] = base["default"].sincos(r3);
const [c3, cd3] = base["default"].sincos(d3);
const a1 = cd1 * cr1;
const a2 = cd2 * cr2;
const a3 = cd3 * cr3;
const b1 = cd1 * sr1;
const b2 = cd2 * sr2;
const b3 = cd3 * sr3;
const l1 = b1 * c2 - b2 * c1;
const l2 = b2 * c3 - b3 * c2;
const l3 = b1 * c3 - b3 * c1;
const m1 = c1 * a2 - c2 * a1;
const m2 = c2 * a3 - c3 * a2;
const m3 = c1 * a3 - c3 * a1;
const n1 = a1 * b2 - a2 * b1;
const n2 = a2 * b3 - a3 * b2;
const n3 = a1 * b3 - a3 * b1;
const ψ = Math.acos((l1 * l2 + m1 * m2 + n1 * n2) /
(Math.sqrt(l1 * l1 + m1 * m1 + n1 * n1) * Math.sqrt(l2 * l2 + m2 * m2 + n2 * n2)));
const ω = Math.asin((a2 * l3 + b2 * m3 + c2 * n3) /
(Math.sqrt(a2 * a2 + b2 * b2 + c2 * c2) * Math.sqrt(l3 * l3 + m3 * m3 + n3 * n3)));
return [ψ, ω]
}
var line = {
time,
angle,
error,
angleError
};
exports.angle = angle;
exports.angleError = angleError;
exports["default"] = line;
exports.error = error;
exports.time = time;