147 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			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;
 |